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

基于tidyverse实现忽略NA并填充最后有效值的累积均值计算

使用tidyverse计算分组累积均值(忽略NA并填充缺失值)

需求说明

按season分组,对tmean列计算累积均值:

  • 忽略原始数据中的NA值
  • 后续的NA行要填充为最近的非NA累积均值
  • 仅使用tidyverse工具实现

示例数据

df <- structure(list(season = c("Winter", "Winter", "Winter", "Winter", 
                                "Winter", "Winter", "Winter", "Winter", "Winter", "Spring", "Spring", 
                                "Spring", "Spring", "Spring", "Spring", "Spring", "Spring", "Spring"
), tmean = c(NA, 2, 3, 4, NA, NA, NA, 8, NA, 7, 8, 9, NA, NA, 
             5, 3, 2, NA)), class = "data.frame", row.names = c(NA, -18L))

原始数据表格:

seasontmean
WinterNA
Winter2
Winter3
Winter4
WinterNA
WinterNA
WinterNA
Winter8
WinterNA
Spring7
Spring8
Spring9
SpringNA
SpringNA
Spring5
Spring3
Spring2
SpringNA

解决方案代码

library(tidyverse)

result <- df %>%
  group_by(season) %>%
  mutate(
    # 计算累积求和(跳过NA值)
    cum_sum = cumsum(replace_na(tmean, 0)),
    # 计算累积非NA值的数量
    cum_n = cumsum(!is.na(tmean)),
    # 生成累积均值,无有效数据时保留NA
    cumtmean = if_else(cum_n == 0, NA_real_, cum_sum / cum_n)
  ) %>%
  # 向下填充NA,让后续空值继承最近的累积均值
  fill(cumtmean, .direction = "down") %>%
  # 清理中间变量
  select(-cum_sum, -cum_n) %>%
  ungroup()

# 查看结果
result

输出结果

# A tibble: 18 × 3
   season tmean cumtmean
   <chr>  <dbl>    <dbl>
 1 Winter    NA   NA    
 2 Winter     2    2    
 3 Winter     3    2.5  
 4 Winter     4    3    
 5 Winter    NA    3    
 6 Winter    NA    3    
 7 Winter    NA    3    
 8 Winter     8    4.25 
 9 Winter    NA    4.25 
10 Spring     7    7    
11 Spring     8    7.5  
12 Spring     9    8    
13 Spring    NA    8    
14 Spring    NA    8    
15 Spring     5    7.25 
16 Spring     3    6.4  
17 Spring     2    5.66 
18 Spring    NA    5.66 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:34