基于年份分组计算列均值并添加为新行的dplyr实现问题
问题解决:按年份分组计算均值并添加为新行
需求
基于year列的相同值分组,计算value1、value2列的均值,并将这些均值作为新行添加到原数据框中。
初始数据
sector <- c(1,1,1,2,2,2,3,3,3) year <- c(1980,1981,1982,1980,1981,1982,1980,1981,1982) value1 <- c(20,21,22,24,25,21,25,27,25) value2 <- c(98,95,85,78,84,86,85,82,83) df <- data.frame(sector, year, value1, value2)
期望结果
sector <- c(1,1,1,2,2,2,3,3,3, "average1980", "average1981", "average1982") year <- c(1980,1981,1982,1980,1981,1982,1980,1981,1982,1980,1981,1982) value1 <- c(20,21,22,24,25,21,25,27,25, 23,24.33,22.667) value2 <- c(98,95,85,78,84,86,85,82,83,87,88,84.667) df44 <- data.frame(sector, year, value1, value2)
问题现状
尝试用dplyr的group_by、summarise、bind_rows等函数实现,但运行后未得到预期的新行,结果不符合要求。尝试代码如下:
df %>% group_by(year) %>% summarise(value1 = mean(value1), value2 = mean(value2)) %>% mutate(sector = paste0("average", year)) %>% bind_rows(df %>% mutate(sector = as.character(sector))) %>% arrange(year, sector, sector != "year")
解决方案
你的核心逻辑没问题,问题出在arrange的无效参数,以及分组后的处理细节。修正后的代码如下:
library(dplyr) # 计算各年份均值并构造均值行 mean_rows <- df %>% group_by(year) %>% summarise( value1 = round(mean(value1), 3), value2 = round(mean(value2), 3), .groups = "drop" # 取消分组,避免绑定数据时的潜在问题 ) %>% mutate(sector = paste0("average", year)) # 绑定原数据(转换sector为字符)和均值行,按年份排序 result_df <- df %>% mutate(sector = as.character(sector)) %>% bind_rows(mean_rows) %>% arrange(year) # 若需要让均值行排在同年份原始数据之后,可修改排序规则: # result_df <- result_df %>% arrange(year, sector != paste0("average", year)) # 查看最终结果 print(result_df)
关键调整说明
- 添加
.groups = "drop"确保分组汇总后取消分组状态,避免bind_rows时的隐性错误; - 用
round函数将均值保留3位小数,和期望结果的格式匹配; - 简化
arrange逻辑,若需控制均值行的位置,可使用sector != paste0("average", year)作为排序辅助条件,让原始行在前、均值行在后。
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

