R语言多列时间聚合需求:按时间分组计算列对均值
按Time聚合计算分组变量均值的解决方案
首先确认一下你的需求:你需要基于Time列分组,对每组分别计算x与y的合并非NA均值、a与b的合并非NA均值、j与k的合并非NA均值——也就是把每组内对应两组列的所有有效数值(非NA)合并后取均值,对吧?
下面用dplyr来实现,因为你的数据已经是tibble格式,用tidyverse工具处理起来更顺手:
步骤1:加载依赖包
如果还没安装dplyr,先运行install.packages("dplyr"),然后加载:
library(dplyr)
步骤2:分组计算均值
直接用管道流完成分组和汇总:
aggregated_df <- df %>% group_by(Time) %>% summarise( # 合并x和y的非NA值计算均值 xy_mean = mean(c(x, y), na.rm = TRUE), # 合并a和b的非NA值计算均值 ab_mean = mean(c(a, b), na.rm = TRUE), # 合并j和k的非NA值计算均值 jk_mean = mean(c(j, k), na.rm = TRUE) )
代码解释
group_by(Time):把所有相同Time值的行归为一组,后续计算都是基于每组进行summarise():生成汇总结果,每个参数对应一个新的汇总列:mean(c(x, y), na.rm = TRUE):将当前分组中x和y的所有值拼接成一个向量,忽略NA后计算均值,得到该组的xy_mean- 另外两个计算逻辑完全一致,分别处理a&b、j&k的组合
结果示例
运行代码后,你会得到符合预期格式的输出,前几行示例如下:
# A tibble: 7 × 4 Time xy_mean ab_mean jk_mean <dbl> <dbl> <dbl> <dbl> 1 100 4.5 7.5 1 2 100.1 7 NA 4 3 100.2 8 3.33 5.33 4 100.3 7 4.75 3.75
处理全NA的情况
如果某个分组里对应的两个列全是NA(比如Time=100.4的j和k列全是NA),上面的代码会返回NaN。如果想把这些NaN替换成NA,可以修改代码:
aggregated_df <- df %>% group_by(Time) %>% summarise( xy_mean = ifelse(all(is.na(c(x, y))), NA, mean(c(x, y), na.rm = TRUE)), ab_mean = ifelse(all(is.na(c(a, b))), NA, mean(c(a, b), na.rm = TRUE)), jk_mean = ifelse(all(is.na(c(j, k))), NA, mean(c(j, k), na.rm = TRUE)) )
这样处理后,全NA的分组对应的均值会显示为NA,结果更整洁。
内容的提问来源于stack exchange,提问作者Kathiravan Meeran
相关产品推荐
相关产品推荐

