面板数据中如何基于首次观测值填补社会阶级变量后续缺失值
问题原因
你之前使用的first(class)仅提取每个个体第一行的class取值,若个体第一期就是缺失值(你数据中用.表示),后续所有行的插补结果都会是缺失,无法匹配需求。
实现代码
library(dplyr) df_imputed <- df %>% group_by(id) %>% mutate( # 标记非缺失记录 valid_flag = class != ".", # 提取个体首次出现的有效class值 first_class = first(class[valid_flag], default = "."), # 提取首次有效class对应的波次 first_wave = first(wave[valid_flag], default = Inf), # 按规则生成插补结果:首次观测波次及之后用首次值,之前保留缺失 class_imputed = if_else(wave >= first_wave, first_class, as.character(class)) ) %>% # 移除中间计算用的辅助列,可根据需要保留 select(-valid_flag, -first_class, -first_wave) %>% ungroup()
逻辑说明
- 按
id分组保证所有计算都在单个个体的时间序列内完成 - 优先定位每个个体第一次出现非缺失
class的时间点和对应取值 - 逐行判断当前波次是否在首次有效观测的时间点之后(含当期),符合条件则用首次值填充,否则保留原有缺失
- 若某个体全程无有效
class观测,默认返回原缺失值,不会抛出错误
适配说明
如果你的数据中缺失值是R标准NA而非自定义的.,只需将valid_flag = class != "."替换为valid_flag = !is.na(class)即可通用。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

