R语言按变电站分组计算各10分钟时间间隔列均值的技术求助
解决按变电站分组计算各10分钟间隔均值的问题
我懂你的痛点——你想给每个变电站单独计算它在每个10分钟时间间隔的均值,最终得到每个变电站一行、每行包含所有时间间隔均值的结果。之前的代码之所以所有变电站结果相同,是因为你用的colMeans是对整个数据集的列计算均值,而不是每个分组内部的列。
问题根源解释
当你在summarise里调用colMeans(tenminintervals[sapply(tenminintervals, is.numeric)])时,tenminintervals指向的是原始的完整数据框,不是当前分组的子集。所以不管你分了多少组,计算出来的都是全局的列均值,自然所有变电站的结果都一样。
正确实现方法(dplyr 1.0.0+推荐写法)
用dplyr的across函数,它能在分组内对指定列批量应用计算,完美适配你的需求:
情况1:所有数值列都是10分钟间隔列
如果你的数据里,除了Substation列,剩下的列全是各个10分钟间隔的数值(比如interval_0000、interval_0010...interval_2350),直接用where(is.numeric)筛选数值列即可:
library(dplyr) mean_by_station <- stationgroup %>% group_by(Substation) %>% summarise(across(where(is.numeric), mean, na.rm = TRUE))
情况2:存在其他非时间间隔的数值列
如果数据里还有其他数值列(比如额外的指标列),可以通过列名前缀或具体列名来精准指定时间间隔列:
# 方式1:按列名前缀筛选(比如所有以interval_开头的列) mean_by_station <- stationgroup %>% group_by(Substation) %>% summarise(across(starts_with("interval_"), mean, na.rm = TRUE)) # 方式2:指定具体列名向量 target_intervals <- c("interval_0000", "interval_0010", "interval_0200", ...) # 替换成你的实际列名 mean_by_station <- stationgroup %>% group_by(Substation) %>% summarise(across(all_of(target_intervals), mean, na.rm = TRUE))
为什么这个写法有效?
across会在每个分组内部,对指定的每一列单独计算均值——也就是说,每个变电站的所有日期数据会被单独拿出来,然后对它的每个10分钟间隔列求平均,最终每个变电站对应一行,列就是各时间间隔的均值。
小提示
别忘了加上na.rm = TRUE参数,这样如果某些日期的某个时间间隔有缺失值,不会导致整个均值变成NA。
内容的提问来源于stack exchange,提问作者Daedomdan
相关产品推荐
相关产品推荐

