如何用data.table对面板数据按分组向前填充NA值
用data.table实现按前有效值填充NA(分组内)
这事儿在data.table里处理起来特别顺手,刚好你的需求是每个ID分组内,用前一个非NA值填充后续的NA,下面给你两种高效的实现方法:
方法1:使用data.table原生nafill()函数(推荐)
nafill()是data.table专门用来处理NA的函数,其中type = "locf"参数就是「Last Observation Carried Forward」——简单说就是把最近的非NA值“带”到后面的NA位置上,完全匹配你的需求。
因为你的数据是用CJ()生成的,已经默认按ID(V1)和年份(V2)排好序了,直接按ID分组填充即可:
library(data.table) # 你的原始数据集 comb <- CJ(1:4, 2005:2008) comb$var3 <- c(1, NA, 2, NA, 3, NA, 4, NA, 5, NA, 6, NA, 7, NA, 8, NA) # 按ID分组,用前一个有效值填充NA comb[, var3 := nafill(var3, type = "locf"), by = V1]
方法2:使用fill()函数(data.table 1.14.0+支持)
如果你习惯更简洁的语法,data.table从1.14.0版本开始也支持fill()函数,用法更直观:
# 同样按ID分组填充 comb[, var3 := fill(var3), by = V1]
补充说明
如果你的数据集不是预先按ID和年份排序的,记得先排序再填充,避免填充顺序出错:
setorder(comb, V1, V2) # 按ID和年份升序排序
运行完上面的代码后,var3就会变成你想要的结果:c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8)。
内容的提问来源于stack exchange,提问作者user9563072
相关产品推荐
相关产品推荐

