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

基于分组数据前一行值迭代计算R中的缺失值

按行业迭代计算缺失的Value值

首先加载你的数据集:

df <- structure(list(Industry = c("A ", "B", "C", "A ", "B", "C", "A ", 
"B", "C", "A ", "B", "C"), Date = c("06-01-2022", "06-01-2022", 
"06-01-2022", "07-01-2022", "07-01-2022", "07-01-2022", "08-01-2022", 
"08-01-2022", "08-01-2022", "09-01-2022", "09-01-2022", "09-01-2022"
), Value = c(43496, 159927, 42428, 44895, 162891, 43091, NA, 
NA, NA, NA, NA, NA), Growth = c(NA, NA, NA, NA, NA, NA, 0.05, 
0.04, 0.03, 0.01, 0.02, 0.06)), row.names = c(NA, 12L), class = "data.frame")

方法一:dplyr 解决方案

利用分组操作结合递推函数处理依赖上一步结果的计算逻辑:

library(dplyr)
library(purrr)

result_dplyr <- df %>%
  group_by(Industry) %>%
  mutate(Value = accumulate(seq_along(Value), .init = first(Value), function(prev, i) {
    if (!is.na(Value[i])) {
      Value[i]
    } else {
      prev * (1 + Growth[i])
    }
  }) %>% tail(-1)) %>%
  ungroup()

# 查看结果
print(result_dplyr)

逻辑说明:从每组第一个非NA的Value开始,逐行判断:如果当前行Value非空则保留原值,否则用上一步计算结果乘以(1+当月Growth),最后去掉初始值保证序列长度匹配。

方法二:data.table 解决方案

适合大数据集的高效分组递推实现:

library(data.table)

dt <- as.data.table(df)

result_dt <- dt[, Value := Reduce(function(prev, i) {
  if (!is.na(Value[i])) Value[i] else prev * (1 + Growth[i])
}, seq_along(Value), init = first(Value))[-1], by = Industry]

# 查看结果
print(result_dt)

逻辑说明:按Industry分组后,用Reduce实现递推计算,生成完整的Value序列后去掉初始值,直接替换原列。

两种方法的输出结果均与你给出的期望输出完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:35:36