在R中如何对数据框的月份列分组并计算任意月份组合的平均值
R实现任意月份组合行均值计算
实现思路
所有月份缩写均为3位字符,可先对传入的月份组合字符串按每3位分割得到目标月份列表,再提取对应列计算行平均值即可。
方案1:基础R实现
直接封装自定义函数调用即可,代码如下:
# 自定义计算月份组合行均值的函数 calc_month_group_mean <- function(df, group_str) { # 按每3位拆分字符串得到月份列表 month_count <- nchar(group_str)/3 months <- substring(group_str, seq(1, 3*month_count, 3), seq(3, 3*month_count, 3)) # 校验月份是否存在 if(!all(months %in% colnames(df))) { stop("输入的月份组合包含不存在的月份,请检查") } # 计算行均值 rowMeans(df[, months], na.rm = TRUE) }
调用示例
# 计算JanFeb组合均值 test_df$JanFeb <- calc_month_group_mean(test_df, "JanFeb") # 计算MarMayNov组合均值 test_df$MarMayNov <- calc_month_group_mean(test_df, "MarMayNov") # 查看结果 head(test_df[, c("Year", "JanFeb", "MarMayNov")])
方案2:tidyverse实现
如果你习惯dplyr的管道操作,可以用以下实现:
library(dplyr) library(stringr) test_df <- test_df %>% # 计算JanFeb组合 mutate(JanFeb = rowMeans(across(all_of(str_extract_all("JanFeb", ".{3}")[[1]])), na.rm = TRUE), # 计算MarMayNov组合 MarMayNov = rowMeans(across(all_of(str_extract_all("MarMayNov", ".{3}")[[1]])), na.rm = TRUE))
以上两种方案都支持任意2-3个月份的组合计算,输出结果为对应月份列的同行平均值,符合需求。
内容的提问来源于stack exchange,提问作者Sayantan4796
相关产品推荐
相关产品推荐

