在 "right-crossing" 数据框上具有多个重复键的合并函数
Merge function with several key repetitions on the "right-crossing" data frame
抱歉这个菜鸟问题,但我真的不知道去哪里搜索我必须做的程序。我的问题是我需要将一列的所有匹配项查找到另一个数据库中以获取另一列的值。某种合并,但在这种情况下,我在正确的数据库中有几个重复的值,因此我需要获取所有匹配项。
更清楚:假设我有这种数据框:
df<-data.frame(CustomerId=c("a","b","c","h"))
CustomerId
1 a
2 b
3 c
4 h
我的其他数据框类似于:
df2<-data.frame(CustomerID=c("a","b","b","b","a","d","c"),code=c(1,2,2,3,2,4,4))
CustomerID code
1 a 1
2 b 2
3 b 2
4 b 3
5 a 2
6 d 4
7 c 4
我需要 "merge" 这两个数据帧,以便我可以获得每个客户 ID 的所有代码。我需要这样的东西:
CustomerId codes
1 a 1,2
2 b 2,3
3 c 4
4 h NA
目前我发现的问题有:
- 我的密钥在交叉数据帧上重复了几次
- 我可以使用循环,但我的数据库太大,我需要避免效率低下
- customerId 在第二个数据帧上可以重复的次数是可变的
- 可能会发生其中一个 customerId 重复多次但只有一个代码,所以我只需要一个代码,而不是所有代码
- 如果在第二个数据库中找不到 CustomerId,我需要一个 NA 值
谢谢大家的帮助,希望你们能帮帮我
使用data.table
的可能解决方案:
library(data.table)
#Convert data.frames to data.tables
dt = data.table(df,key="CustomerId")
dt2 = data.table(df2, key ="CustomerID")
#rename to account for case sensitivity
setnames(dt2,"CustomerID","CustomerId")
#merge files retaining all values even those that has no matching key
dt3 = merge(dt,dt2,all=T)
#list unique codes split by "CustomerId"
dt3[,list(code=list(unique(code))),by="CustomerId"]
如果在这一点之后使用 data.tables 感到不舒服,任何 data.table
对象都可以很容易地重新转换为 data.frame
,就像:df = data.frame(dt)
.
这是另一个使用 data.table
二元连接
的快速解决方案
library(data.table)
Res <- setDT(df2)[, .(codes = toString(unique(code))), key = CustomerID]
Res[df]
# CustomerID codes
# 1: a 1, 2
# 2: b 2, 3
# 3: c 4
# 4: h NA
抱歉这个菜鸟问题,但我真的不知道去哪里搜索我必须做的程序。我的问题是我需要将一列的所有匹配项查找到另一个数据库中以获取另一列的值。某种合并,但在这种情况下,我在正确的数据库中有几个重复的值,因此我需要获取所有匹配项。
更清楚:假设我有这种数据框:
df<-data.frame(CustomerId=c("a","b","c","h"))
CustomerId
1 a
2 b
3 c
4 h
我的其他数据框类似于:
df2<-data.frame(CustomerID=c("a","b","b","b","a","d","c"),code=c(1,2,2,3,2,4,4))
CustomerID code
1 a 1
2 b 2
3 b 2
4 b 3
5 a 2
6 d 4
7 c 4
我需要 "merge" 这两个数据帧,以便我可以获得每个客户 ID 的所有代码。我需要这样的东西:
CustomerId codes
1 a 1,2
2 b 2,3
3 c 4
4 h NA
目前我发现的问题有:
- 我的密钥在交叉数据帧上重复了几次
- 我可以使用循环,但我的数据库太大,我需要避免效率低下
- customerId 在第二个数据帧上可以重复的次数是可变的
- 可能会发生其中一个 customerId 重复多次但只有一个代码,所以我只需要一个代码,而不是所有代码
- 如果在第二个数据库中找不到 CustomerId,我需要一个 NA 值
谢谢大家的帮助,希望你们能帮帮我
使用data.table
的可能解决方案:
library(data.table)
#Convert data.frames to data.tables
dt = data.table(df,key="CustomerId")
dt2 = data.table(df2, key ="CustomerID")
#rename to account for case sensitivity
setnames(dt2,"CustomerID","CustomerId")
#merge files retaining all values even those that has no matching key
dt3 = merge(dt,dt2,all=T)
#list unique codes split by "CustomerId"
dt3[,list(code=list(unique(code))),by="CustomerId"]
如果在这一点之后使用 data.tables 感到不舒服,任何 data.table
对象都可以很容易地重新转换为 data.frame
,就像:df = data.frame(dt)
.
这是另一个使用 data.table
二元连接
library(data.table)
Res <- setDT(df2)[, .(codes = toString(unique(code))), key = CustomerID]
Res[df]
# CustomerID codes
# 1: a 1, 2
# 2: b 2, 3
# 3: c 4
# 4: h NA