You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:合并重复观测集补全面板数据缺失值并去重

解决方案(基于data.table)

针对你的面板数据填充需求,以下是用data.table实现的高效步骤,适配你提供的测试数据:

核心思路

  1. 锁定每个ID1下的目标实体(你已按缺失量排序后的首个ID2)
  2. 按ID1+year分组,用同组内其他实体的非缺失值填充目标实体的缺失项
  3. 最终仅保留填充后的目标实体,删除其余重复条目

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:44:53