如何结合已知值计算长格式纵向数据中缺失的study_year?
填充纵向数据集中的缺失study_year值
我有一份长格式的纵向数据集,每个id对应基线评估后的年份(years_since_baseline),部分评估记录包含study_year但存在缺失值。需要基于评估间的时间间隔填充缺失的study_year——比如第6行的study_year可通过2018 + 1.02 = 2019.02计算得到。不同id的已知study_year位置不同,有的在首条记录,有的在中间,有的在末条。之前尝试组合使用group_by、fill和lag方法计算缺失年份,但未成功。
原始数据集
id years_since_baseline study_year 1 1 3.09 NA 2 1 3.87 NA 3 1 4.91 2021 4 1 6.36 NA 5 2 0 2018 6 2 1.02 NA 7 2 2.40 NA 8 3 13.9 NA 9 3 15.0 NA 10 3 15.71 2017
期望结果
id years_since_baseline study_year 1 1 3.09 2019.08 2 1 3.87 2019.96 3 1 4.91 2021 4 1 6.36 2022.45 5 2 0 2018 6 2 1.02 2019.02 7 2 2.40 2020.40 8 3 13.9 2015.19 9 3 15.0 2016.29 10 3 15.71 2017
解决方案
核心思路是:每个id的基线年份固定,可通过已知的study_year和对应years_since_baseline反推得出,再用基线年份加上每条记录的years_since_baseline直接计算缺失的study_year。
用tidyverse实现的代码如下:
library(tidyverse) # 构造原始数据集 df <- data.frame( id = c(1,1,1,1,2,2,2,3,3,3), years_since_baseline = c(3.09, 3.87, 4.91, 6.36, 0, 1.02, 2.40, 13.9, 15.0, 15.71), study_year = c(NA, NA, 2021, NA, 2018, NA, NA, NA, NA, 2017) ) # 填充缺失值 df_filled <- df %>% group_by(id) %>% # 计算当前id的基线年份:取第一个非NA的study_year减去对应years_since_baseline mutate(baseline_year = first(study_year[!is.na(study_year)] - years_since_baseline[!is.na(study_year)])) %>% # 计算所有记录的study_year mutate(study_year = baseline_year + years_since_baseline) %>% # 保留两位小数(与期望结果格式一致) mutate(study_year = round(study_year, 2)) %>% # 移除临时列 select(-baseline_year) %>% ungroup() # 查看结果 print(df_filled)
代码说明
- 分组计算基线年份:按
id分组后,通过非NA的study_year和对应years_since_baseline反推基线年份(基线年份 = 已知study_year - 对应years_since_baseline)。 - 填充所有study_year:用基线年份加上每条记录的
years_since_baseline,直接得到该记录的study_year,无需依赖前后行的顺序填充。 - 格式调整:将结果保留两位小数,与期望结果的格式对齐。
运行后得到的结果与期望一致,解决了不同位置已知值的填充问题。
内容的提问来源于stack exchange,提问作者nd3154
相关产品推荐
相关产品推荐

