按年份对DataFrame列数据求均值的实现方法
解决方案
首先需要从date列提取年份,再按年份分组计算overall和eastern的均值,以下是几种可行的实现方式:
方法一:Base R 用 aggregate(推荐,直接得到目标DataFrame)
# 提取年份列 df$year <- substr(df$date, 1, 4) # 按年份分组求均值 result <- aggregate(cbind(overall, eastern) ~ year, data = df, FUN = mean)
运行后result就是你需要的3列3行DataFrame,结构示例:
year overall eastern 1 1997 17.54800 18.75100 2 1998 20.38250 21.43658 3 1999 20.87592 21.89508
方法二:修正tapply的用法
tapply默认处理单个向量,若要处理多列,可结合lapply实现:
df$year <- substr(df$date, 1, 4) # 对目标列分别用tapply计算均值 mean_list <- lapply(df[, c("overall", "eastern")], function(x) tapply(x, df$year, mean)) # 转换为DataFrame并整理格式 result <- as.data.frame(do.call(cbind, mean_list)) result$year <- rownames(result) result <- result[, c("year", "overall", "eastern")]
方法三:用dplyr包(管道式操作更简洁)
如果习惯tidyverse工具链,用dplyr的分组求和会更直观:
library(dplyr) result <- df %>% mutate(year = substr(date, 1, 4)) %>% group_by(year) %>% summarise(overall = mean(overall), eastern = mean(eastern)) %>% ungroup()
补充说明
你之前用tapply失败,大概率是因为直接传入了整个DataFrame而非单个向量——tapply的第一个参数要求是向量,因此处理多列时需要结合循环或其他函数批量处理。相比之下,aggregate或dplyr的分组求和更适配这种多列分组统计的场景。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

