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

在R中按ID和Age分组为缺失x1值计算1.5%增长值的问题

问题需求

针对每个ID的观测组,以组内首个非缺失的x1值为基础,为后续年份(Age递增)的x1缺失值按每年1.5%的增长率计算补全值。

示例数据

# 创建示例数据集
data <- data.frame(
  ID = c(1,1,1,2,2,2,3,3,3),
  Age = c(20,21,22,20,21,22,20,21,22),
  x1 = c(9.4,NA, NA, 11.5, NA, NA, 12.1, NA, NA)
)

已尝试方法的问题分析

  • dplyr方法错误:
    分组逻辑不对,应该按ID分组(每个ID对应一组连续年龄序列),而非ID + Age——后者会把每一行拆成单独分组,根本没法实现组内递推;另外lag(x1)只能取前一行值,遇到连续NA时(比如第三行),前一行本身是NA,自然无法计算。
  • 嵌套循环方法错误:
    没有针对每个ID单独处理全局数据,跨ID计算逻辑混乱;且错误使用全局的lag(data$x1),没有聚焦到每个ID的组内序列做递推。

正确解决方案

方法1:基于年龄差直接计算(推荐)

按ID分组后,先拿到组内首行的x1基准值,再根据当前行与首行的年龄差计算增长倍数:

library(dplyr)

filled_data <- data %>%
  group_by(ID) %>%
  mutate(
    # 获取组内第一个非缺失的x1基准值
    base_x1 = first(x1[!is.na(x1)]),
    # 计算当前年龄与首年龄的差值(即增长年数)
    year_diff = Age - first(Age),
    # 补全缺失值:基准值 * (1+1.5%)^年数,保留两位小数
    x1 = ifelse(is.na(x1), round(base_x1 * (1.015)^year_diff, 2), x1)
  ) %>%
  # 移除临时变量
  select(-base_x1, -year_diff) %>%
  ungroup()

print(filled_data)

方法2:逐行递推计算

如果需要严格基于前一行补全后的值计算下一行(逻辑和手动递推一致),可以用purrr::accumulate实现:

library(dplyr)
library(purrr)

filled_data <- data %>%
  group_by(ID) %>%
  mutate(
    x1 = accumulate(x1, ~ifelse(is.na(.y), round(.x * 1.015, 2), .y))
  ) %>%
  ungroup()

print(filled_data)

验证结果

运行上述代码后,输出结果与期望完全一致:

# 期望结果
expected_data <- data.frame(
  ID = c(1,1,1,2,2,2,3,3,3),
  Age = c(20,21,22,20,21,22,20,21,22),
  x1 = c(9.4,9.54, 9.68, 11.5, 11.67, 11.84, 12.1, 12.28, 12.46)
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:11:12