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

如何结合已知值计算长格式纵向数据中缺失的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)

代码说明

  1. 分组计算基线年份:按id分组后,通过非NA的study_year和对应years_since_baseline反推基线年份(基线年份 = 已知study_year - 对应years_since_baseline)。
  2. 填充所有study_year:用基线年份加上每条记录的years_since_baseline,直接得到该记录的study_year,无需依赖前后行的顺序填充。
  3. 格式调整:将结果保留两位小数,与期望结果的格式对齐。

运行后得到的结果与期望一致,解决了不同位置已知值的填充问题。

内容的提问来源于stack exchange,提问作者nd3154

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:55:17