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

如何在R语言中按年份计算高于均值的列条件求和?

解决方案

首先修正测试数据里的语法错误(COMP2列的> 1是无效值,这里替换为1):

Year <- c(2001, 2001, 2001, 2002, 2002, 2003, 2003, 2004, 2004)
COMP1 <- c(NA, 1, 2, 6, 9, NA, 2, 1, NA)  
COMP2 <- c(2, 3, 3, 3, 6, 4, 1, 0, 1)   
COMP3 <- c(NA, 1, 2, 3, 4, 0, 0, 1, 0)   
COMP4 <- c(25, 29, 16, 17, NA, 20, NA, 21, 12)

DF <- data.frame(Year, COMP1, COMP2, COMP3, COMP4)

方法1:Base R实现

核心思路是先按年份计算各列均值,再匹配原数据筛选出高于均值的数值后求和:

# 按年份计算各公司列的均值
mean_by_year <- aggregate(. ~ Year, data = DF, FUN = mean, na.rm = TRUE)

# 将原数据和均值表转为长格式,方便匹配
library(reshape2)
df_long <- melt(DF, id.vars = "Year", variable.name = "Company", value.name = "Value")
mean_long <- melt(mean_by_year, id.vars = "Year", variable.name = "Company", value.name = "YearlyMean")

# 匹配均值并筛选符合条件的数值,最后分组求和
df_merged <- merge(df_long, mean_long, by = c("Year", "Company"))
result <- aggregate(Value ~ Year + Company, data = df_merged[df_merged$Value > df_merged$YearlyMean, ], FUN = sum, na.rm = TRUE)

# 转回宽格式(和原数据结构对应,可选)
result_wide <- dcast(result, Year ~ Company, value.var = "Value", fill = 0)

方法2:dplyr + tidyr 实现(更简洁)

用tidyverse工具链可以一步完成分组、计算均值、筛选求和:

library(dplyr)
library(tidyr)

result <- DF %>%
  pivot_longer(cols = starts_with("COMP"), names_to = "Company", values_to = "Value") %>%
  group_by(Year, Company) %>%
  mutate(YearlyMean = mean(Value, na.rm = TRUE)) %>%
  filter(Value > YearlyMean) %>%
  summarise(SumAboveMean = sum(Value, na.rm = TRUE)) %>%
  pivot_wider(names_from = "Company", values_from = "SumAboveMean", values_fill = 0)

说明

  • 两种方法都支持处理大量公司列(比如你的6121列),核心逻辑无需修改
  • 过程中自动忽略NA值,若需保留NA可调整na.rm参数
  • 最终结果按年份展示各公司列中高于当年均值的数值之和,无符合条件值的位置填充0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:42:47