我有两个数据集,我想将第二个数据集映射到第一个数据集:
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包来加速,因为我的文件每个大于2GB。无论是映射文件还是我必须将值映射到的文件。
有什么建议如何在R中实现这一点?
更新
我想要的输出:

发布于 2015-02-09 12:30:11
您只需要使用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中移除行,并将NAs分配给相关列
更好的选择(如果您在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`https://stackoverflow.com/questions/28409672
复制相似问题