我有两个数据集,我想将第二个数据集映射到第一个数据集:
n <- c(2, 3, 5,6,7,8)
s <- c("aa", "bb", "cc","aa", "bb", "cc")
b <- c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)
df <- data.table(n, s, b)
rs <- c("aa", "bb", "cc")
replace1 <- c("Product 1", "Product 2", "Product 3")
replace2 <- c("Customer 1", "Customer 2", "Customer 3")
df.replace <- data.table(rs, replace1, replace2)
所以基本上如果df
中的aa
是Product 1
,我想添加一个Customer 1
和data.table
的列。
此外,我还使用{{1}}包来提高速度,因为我的文件大小都超过2 GB。映射文件以及我必须将值映射到的文件。
如何在R?
中实现这一点的任何建议更新
我想要的输出:
答案 0 :(得分:4)
您只需使用data.table
二进制联接来执行正确加入
setkey(df, s) # key `df` by `s`
(Res <- df[df.replace]) # Perform the binary join
# n s b replace1 replace2
# 1: 2 aa TRUE Product 1 Customer 1
# 2: 6 aa FALSE Product 1 Customer 1
# 3: 3 bb FALSE Product 2 Customer 2
# 4: 7 bb TRUE Product 2 Customer 2
# 5: 5 cc TRUE Product 3 Customer 3
# 6: 8 cc FALSE Product 3 Customer 3
修改强>
或(根据您的评论)您还可以使用二进制加入左连接
setkey(df.replace, rs) # key `df.replace` by `rs`
setkey(df, s) # key `df` by `s`
(Res <- df.replace[df])
# rs replace1 replace2 n b
# 1: aa Product 1 Customer 1 2 TRUE
# 2: aa Product 1 Customer 1 6 FALSE
# 3: bb Product 2 Customer 2 3 FALSE
# 4: bb Product 2 Customer 2 7 TRUE
# 5: cc Product 3 Customer 3 5 TRUE
# 6: cc Product 3 Customer 3 8 FALSE
使用此联接,如果df.replace
中的值不匹配,则不会从df
中删除行并将NA
分配给相关列
更好的选择(如果df.replace
中没有太多列)是通过引用df
来分配这些值。这样,您无需在任何地方保存结果,df
将自行更新。
setkey(df, s) # key `df` by `s`
df[df.replace,
`:=`(replace1 = replace1,
replace2 = replace2)
] # Perform the binary join and save results in `df`