R语言:合并重复观测集补全面板数据缺失值并去重
解决方案(基于data.table)
针对你的面板数据填充需求,以下是用data.table实现的高效步骤,适配你提供的测试数据:
核心思路
- 锁定每个
ID1下的目标实体(你已按缺失量排序后的首个ID2) - 按
ID1+year分组,用同组内其他实体的非缺失值填充目标实体的缺失项 - 最终仅保留填充后的目标实体,删除其余重复条目
代码实现
library(data.table) # 测试数据 tab = data.table(ID1 = rep("A", 9), ID2 = c(rep("AA", 3), rep("AB", 3), rep("AC", 3)), year = c(2010, 2011, 2012, 2010, 2011, 2012, 2010, 2011, 2012), var1 = c(100, NA, 150, 100, 120, NA, NA, NA, NA), var2 = c(NA, NA, NA, 4, 5, NA, NA, 5, 2), var3 = c(4.1, 3.1, 2.7, NA, 3.1, NA, 4.1, NA, NA)) # 1. 确定每个ID1对应的目标实体(已排序后的第一个ID2) target_ids = tab[, .(target_ID2 = first(ID2)), by = ID1] # 2. 合并目标实体标记到原表 tab = tab[target_ids, on = "ID1"] # 3. 按ID1+year分组,用非缺失值填充(优先保留目标实体的原值,再用其他实体补充) filled_tab = tab[, lapply(.SD, function(x) na.omit(x)[1]), by = .(ID1, year), .SDcols = c("var1", "var2", "var3")] # 4. 整合目标ID2,生成最终数据集 filled_tab = filled_tab[target_ids, on = "ID1"] filled_tab = filled_tab[, .(ID1, ID2 = target_ID2, year, var1, var2, var3)] # 查看结果 print(filled_tab)
输出结果
ID1 ID2 year var1 var2 var3 1: A AA 2010 100 4 4.1 2: A AA 2011 120 5 3.1 3: A AA 2012 150 2 2.7
关键细节说明
na.omit(x)[1]确保优先取分组内第一个非缺失值(因为你已按缺失量排序,目标实体排在最前,仅当目标实体对应值缺失时,才会取后续实体的非缺失值)- 代码支持多
ID1的批量处理,无需单独修改 - 最终数据集仅保留每个
ID1下的目标实体,自动剔除其他重复条目
内容的提问来源于stack exchange,提问作者Laurence_jj
相关产品推荐
相关产品推荐

