基于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))
原始数据表格:
| season | tmean |
|---|---|
| Winter | NA |
| Winter | 2 |
| Winter | 3 |
| Winter | 4 |
| Winter | NA |
| Winter | NA |
| Winter | NA |
| Winter | 8 |
| Winter | NA |
| Spring | 7 |
| Spring | 8 |
| Spring | 9 |
| Spring | NA |
| Spring | NA |
| Spring | 5 |
| Spring | 3 |
| Spring | 2 |
| Spring | NA |
解决方案代码
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
相关产品推荐
相关产品推荐

