You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于年份分组计算列均值并添加为新行的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)

关键调整说明

  1. 添加.groups = "drop"确保分组汇总后取消分组状态,避免bind_rows时的隐性错误;
  2. 用round函数将均值保留3位小数,和期望结果的格式匹配;
  3. 简化arrange逻辑,若需控制均值行的位置,可使用sector != paste0("average", year)作为排序辅助条件,让原始行在前、均值行在后。

内容的提问来源于stack exchange,提问作者Ayoze Alfageme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:47:13