如何将含重复纠错条目的R data.table合并为每个ID对应的完整记录
处理思路
针对你描述的「先录入错误记录、再新增修正记录」的重复数据场景,按以下两步处理即可得到你想要的结果:
- 先补全空的id字段:空id对应的是前一条非空id的同组修正记录,用上一个非空id填充所有空id完成分组标记
- 按id分组后对每个字段提取非空的有效值即可,你的示例中同id同字段的非空值完全一致,直接去重提取即可
代码实现(基于data.table)
library(data.table) # 示例数据 dt1 <- data.table( id = c('a','','a','b','','b','c','','c'), v1 =c('a','a','a','b','b','','c','','c'), v2 =c('a','a','a','b','','b','','','c'), v3 =c('a','a','a','','b','','','c',''), v4 =c('','a','','b','','','c','','c'), v5 =c('a','','a','','','b','','','c'), v6 =c('','a','','','b','b','c','c','c') ) # 1. 填充空id,将空字符串转为NA后用上一个非空值填充 dt1[id == "", id := NA] dt1[, id := zoo::na.locf(id)] # 2. 按id分组,每个字段提取非空的唯一值 result <- dt1[, lapply(.SD, function(col) unique(col[col != ""])), by = id]
运行后result就是你期望的输出结果。
补充说明
如果你的实际数据存在特殊情况,可以按需求调整逻辑:
- 若同id同字段存在多个不同的非空值,说明存在冲突的修正记录,可以调整取值逻辑,比如取最后一次录入的记录对应的值作为有效值
- 若你的数据空值用
NA而非空字符串存储,把代码中的col != ""替换为!is.na(col)即可
内容的提问来源于stack exchange,提问作者econfin
相关产品推荐
相关产品推荐

