如何为纵向数据中2015年Var3的NA值按PID填充前后年份均值
针对特定PID与年份的Var3缺失值填充方案
核心逻辑是按受访者标识(PID)分组,仅定位2015年Var3的缺失值,用同组内2014和2016年的Var3均值进行填充,避免跨受访者的数据混淆。以下是两种可直接复用的实现方案:
方案一:使用dplyr(tidyverse生态,推荐)
适合习惯tidy语法的用户,代码可读性高且处理大型数据集效率优异:
library(dplyr) # 假设你的数据集名为df,包含列:PID, Year, Var3 df_filled <- df %>% group_by(PID) %>% mutate( # 计算当前PID组内2014、2016年Var3的均值 var3_group_mean = mean(c(Var3[Year == 2014], Var3[Year == 2016]), na.rm = TRUE), # 仅替换2015年Var3的NA值,其余行保持原样 Var3 = ifelse(Year == 2015 & is.na(Var3), var3_group_mean, Var3) ) %>% ungroup() %>% select(-var3_group_mean) # 移除临时计算的中间列
方案二:使用Base R(无需额外安装包)
适合偏好原生R语法的用户:
# 按PID分组处理Var3列 df$Var3 <- ave(df$Var3, df$PID, FUN = function(var_vals) { # 获取当前PID组对应的年份向量 group_years <- df$Year[df$PID == unique(df$PID)] # 提取2014和2016年的Var3值 val_2014 <- var_vals[group_years == 2014] val_2016 <- var_vals[group_years == 2016] # 计算均值(na.rm=TRUE允许单一年份有值时仍能计算) fill_mean <- mean(c(val_2014, val_2016), na.rm = TRUE) # 精准替换2015年的NA ifelse(group_years == 2015 & is.na(var_vals), fill_mean, var_vals) })
注意事项
- 若某PID的2014或2016年Var3本身存在缺失,
na.rm=TRUE会自动忽略NA值计算剩余年份的数值;若两年均为NA,会返回NaN,可根据实际业务需求添加额外判断逻辑(比如跳过该组填充) - 处理超大型数据集时,优先选择dplyr方案,其底层优化能显著提升运行速度
内容的提问来源于stack exchange,提问作者Moritary
相关产品推荐
相关产品推荐

