提问人:Ann 提问时间:9/11/2023 最后编辑:halferAnn 更新时间:9/12/2023 访问量:33
合并两个 data.tables,添加另一列并保留重复项
Merge two data.tables, add another column and keep the duplicates
问:
我有两个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() 向代码的读者明确说明此意图。
我可以尝试什么来解决这个问题?
答:
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
对于第二步,我将进行修改以包含未映射的行。Df1
Df2
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
评论