如何在保留含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
相关产品推荐
相关产品推荐

