在 "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

目前我发现的问题有:

谢谢大家的帮助,希望你们能帮帮我

使用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