R中如何基于ID匹配为data.table数据集的列填充对应值?
解决方案
你可以直接用data.table内置的更新连接(update join)实现需求,代码简洁且性能极高:
library(data.table) # 方法1:原地修改df1,适合不需要保留原始df1的场景 df1[df2, on = .(ID), text := i.text] # 方法2:不修改原始df1,生成新的结果表 res <- copy(df1) res[df2, on = .(ID), text := fcoalesce(i.text, x.text)]
代码说明
- 关联逻辑:通过
on = .(ID)指定两个表按ID字段匹配 - 取值逻辑:
i.text代表取右表(也就是df2)的text字段值,匹配成功的行默认优先用该值覆盖df1的text- 如果需要兼容df2也存在空值的场景,用
fcoalesce(i.text, x.text)可以实现:只有当df2的text非空时才替换,否则保留df1原有值(x.text代表左表df1的原有text值)
- 性能优势:该方法是原地更新,不需要生成中间合并表,适合处理百万级以上的大数据集
运行后得到的结果和你期望的输出完全一致:
ID text 1: 1 a 2: 2 a 3: 3 b 4: 4 b 5: 5 <NA> 6: 6 a 7: 7 a 8: 8 a 9: 9 c 10: 10 <NA>
内容的提问来源于stack exchange,提问作者Besz15
相关产品推荐
相关产品推荐

