合并两个 data.tables,添加另一列并保留重复项

Merge two data.tables, add another column and keep the duplicates

提问人:Ann 提问时间:9/11/2023 最后编辑:halferAnn 更新时间:9/12/2023 访问量:33

问:

我有两个data.tables:

Df1:(15.000 次观测)

编号
10101 8119500101
10601 13071516106
10601 13071516106
10800 8235500200

Df2:(45.000.000 次观测值)

8119500101 13071516106
8235500200 8235500200
8119500101 8119500101

列“ID”和“from”和“to”包含相同的值。我想匹配每个“ID”和“from”以及“ID”和“to”以添加列“NO”:

Df2:

NO_from NO_to
8119500101 13071516106 10101 10601
8235500200 8235500200 10800 10800
8119500101 8119500101 10101 10101

此外,对于某些“NO”值,没有匹配项,但是,我不想忽略它们,而是想保留它们以及重复项。

Df2:

NO_from NO_to
8119500101 13071516106 10101 10601
8235500200 8235500200 10800 10800
8119500101 8119500101 10101 10101
00008 00008

我试过了这个,但是没有用:

setDT(df2) [, "from_NO" := df1$NO[match(df2$from, df1$ID)],]
setDT(df2) [, "to_NO" := df1$NO[match(df2$to, df1$ID)],]

另外,我收到了以下错误:

提供44571901项目,分配给“from_MT_Zone”列的 15782 个项目。如果您希望“回收”RHS,请使用 rep() 向代码的读者明确说明此意图。

我可以尝试什么来解决这个问题?

合并 重复项 data.table 匹配

评论


答:

1赞 r2evans 9/11/2023 #1

两步加盟:

library(data.table)
setDT(Df1)
setDT(Df2)
Df2[Df1, NO_from := i.NO, on = .(from == ID)
  ][Df1, NO_to := i.NO, on = .(to == ID)][]
#          from          to NO_from NO_to
#         <num>       <num>   <int> <int>
# 1: 8119500101 13071516106   10101 10601
# 2: 8235500200  8235500200   10800 10800
# 3: 8119500101  8119500101   10101 10101

对于第二步,我将进行修改以包含未映射的行。Df1Df2

Df1 <- rbindlist(list(Df1, data.table(NO=10999L, ID=10)))
Df1
#       NO          ID
#    <int>       <num>
# 1: 10101  8119500101
# 2: 10601 13071516106
# 3: 10601 13071516106
# 4: 10800  8235500200
# 5: 10999          10

rbindlist(list(
  # the original, after our double-merge above
  Df2,
  # everything else
  Df1[(!NO %in% Df2$NO_from & !NO %in% Df2$NO_to),
      .(NO_from = NO, NO_to = NO)]
  ),fill = TRUE, use.names = TRUE)
#          from          to NO_from NO_to
#         <num>       <num>   <int> <int>
# 1: 8119500101 13071516106   10101 10601
# 2: 8235500200  8235500200   10800 10800
# 3: 8119500101  8119500101   10101 10101
# 4:         NA          NA   10999 10999