如何通过ID匹配用另一data.table填充带NA值的data.table缺失字段
最优实现方案(data.table原生update join)
这是最符合你需求的原生操作,支持动态传入需要填充的列名,性能远高于合并再拆分的方案,且不会修改不需要变动的列:
- 先定义需要填充的列名向量(可根据场景动态生成)
library(data.table) # 示例为需要填充的y、z列,可按需修改或动态生成该向量 fill_cols <- c("y", "z")
- 执行update join填充缺失值
如果需要保留原dt1的非NA值,仅填充NA,使用带fcoalesce的版本:
# 不想修改原dt1的话,先复制一份再操作:dt1_new <- copy(dt1) dt1[dt2, on = .(id), (fill_cols) := Map(fcoalesce, mget(fill_cols), mget(paste0("i.", fill_cols)))]
如果你需要直接用dt2的所有值覆盖dt1中匹配id的对应列(不管dt1是否为NA),可以简化为:
dt1[dt2, on = .(id), (fill_cols) := mget(paste0("i.", fill_cols))]
方案说明
- 该操作是data.table特有的原地更新操作,处理大表时内存开销极低,速度远快于merge+rbind的方案
- 所有逻辑仅依赖
fill_cols字符向量,列名变动时只需修改该向量即可,适配函数内动态调用的场景 - 自动匹配两个表的id,不需要手动过滤重叠id
运行后的dt1和你给出的goal结果完全一致。
内容的提问来源于stack exchange,提问作者Jakob
相关产品推荐
相关产品推荐

