首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并两个`data.table`对象

合并两个`data.table`对象
EN

Stack Overflow用户
提问于 2015-02-09 12:20:18
回答 1查看 429关注 0票数 2

我有两个数据集,我想将第二个数据集映射到第一个数据集:

代码语言:javascript
运行
复制
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 1Customer 1的列。

此外,我还使用data.table包来加速,因为我的文件每个大于2GB。无论是映射文件还是我必须将值映射到的文件。

有什么建议如何在R中实现这一点?

更新

我想要的输出:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-09 12:30:11

您只需要使用data.table的二进制联接来执行右连接

代码语言:javascript
运行
复制
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

编辑

或者(根据您的注释),您也可以使用二进制联接执行左联接

代码语言:javascript
运行
复制
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就会自行更新。

代码语言:javascript
运行
复制
setkey(df, s) # key `df` by `s`
df[df.replace, 
         `:=`(replace1 = replace1, 
              replace2 = replace2)
   ] # Perform the binary join and save results in `df`
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28409672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档