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

如何在保留含NA的行的前提下计算每周均值

问题:为每周所有行添加该周的均值列(基于非NA值计算)

我有一个包含多周数据的数据集,部分日期未采样因此R生成了NA值。希望基于每周的采样天数计算每周均值(例如第1周仅采样3天),但目前使用na.omit()后仅保留了采样天数的均值行,想要新增一列,让每周的所有7行都显示该周的均值(如第1周7行都显示148,第4周7行都显示117)。

原数据与代码

# 数据
a <- structure(list(wk = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4), month = c(1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1), xd = c(0.0370098838217444, 0.0391215970961887, 
0.0409865246890313, NA, NA, NA, NA, 0.015188, 0.007513, 0.012716, 
0.013962, 0.014259, 0.023553, 0.032122, 0.03953, 0.028946, 0.030769, 
0.030815, 0.029187, 0.022604, 0.02892, 0.031055, 0.041924, 0.038164, 
0.044705, NA, NA, NA), td = c(0.02701157274146, 0.0284158620689655, 
0.0296560389182058, NA, NA, NA, NA, 0.0125, 0.007396, 0.010856, 
0.011685, 0.011882, 0.018063, 0.023761, 0.028687, 0.021649, 0.022861, 
0.022892, 0.021809, 0.017432, 0.021632, 0.023052, 0.030279, 0.027779, 
0.032129, NA, NA, NA), pd = c(317.308439683869, 0, 126.719553152898, 
NA, NA, NA, NA, 2671.6, 3540.6976744186, 1270.35740604274, 1067.69362430466, 
688.099646524154, 317.444499806234, 420.941879550524, 280.475476696762, 
250.681324772507, 159.048160622895, 258.125109208457, 450.868907331836, 
0, 120.83949704142, 244.794377928162, 0, 226.610029158717, 0, 
NA, NA, NA), year = c(2007, 2007, 2007, 2007, 2007, 2007, 2007, 
2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 
2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007)), class = "data.frame", row.names = c(NA, 
-28L))

library(tidyverse)
a <- a %>% group_by(wk) %>% mutate(wk_days = length(wk))
a

# 期望得到每周pd的均值,比如第1周是148,但使用na.omit()后只保留了有采样值的行
# 希望新增一列,让每周7行都显示该周的均值,而不是只有采样行显示
a <- a %>% group_by(wk_days, year, month, wk) %>% na.omit() %>%
  reframe(avg = mean(pd), summed_avg = avg*wk_days) %>% arrange(wk) %>%
  data.frame()
a

原代码执行后仅保留了非NA的行,无法实现每周7行都显示均值的需求。

解决方案

不需要使用na.omit()删除NA行,直接在mutate中计算均值时添加na.rm=TRUE参数忽略NA值,同时按周分组即可为每组的所有行添加均值列。

修正后的代码

library(tidyverse)

# 保留原始所有行,新增每周均值列
a_result <- a %>% 
  group_by(wk, year, month) %>% 
  mutate(
    wk_days = n(), # 每周总天数,这里固定为7
    sampled_days = sum(!is.na(pd)), # 每周实际采样天数
    avg_pd = mean(pd, na.rm = TRUE), # 基于非NA值计算每周均值
    summed_avg = avg_pd * wk_days
  ) %>% 
  ungroup() # 取消分组(可选)

# 查看结果
a_result

结果说明

执行后avg_pd列会为每周的7行都填充该周的均值:

  • 第1周的7行avg_pd均为148.0093
  • 第4周的7行avg_pd均为117.8511
    同时保留了原始数据的所有行和列,满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:04:55