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

在R中模拟Excel SumIfs()实现逐行条件均值向量

实现R版的"Mean-If"(类似Excel SumIfs的均值版)

刚好做过类似的需求!你要的其实是为数据框每行匹配其对应分组的均值,本质是把分组汇总的结果「广播」到每一行,而不是只保留分组后的单行汇总。下面给你几种简单易懂的实现方式,覆盖不同的R工具链:

先构造示例数据

方便你测试,先创建一个模拟数据框:

df <- data.frame(
  a = c(1, 2, 1, 3, 2, 1),
  b = c("x", "y", "x", "z", "y", "x"),
  c = c(10, 20, 30, 40, 50, 60)
)

方法1:用dplyr(tidyverse风格)

这是最直观的写法,适合习惯tidyverse语法的用户:

library(dplyr)

df <- df %>%
  group_by(a) %>%  # 按a列的值分组
  mutate(d = mean(c)) %>%  # 为每组的每一行添加该组c列的均值
  ungroup()  # 取消分组,恢复普通数据框格式

方法2:用data.table(高效快速)

如果你处理的是大数据集,data.table的速度优势会很明显,语法也更简洁:

library(data.table)

setDT(df)[, d := mean(c), by = a]  # 按a分组,直接在原数据框添加d列

方法3:基础R(无需额外包)

不用安装任何扩展包,用基础R的ave()函数就能搞定,它专门用来生成和原向量长度一致的分组统计结果:

df$d <- ave(df$c, df$a, FUN = mean)

运行结果示例

不管用哪种方法,最终得到的数据框都会是这样:

a b  c        d
1 1 x 10 33.33333
2 2 y 20 35.00000
3 1 x 30 33.33333
4 3 z 40 40.00000
5 2 y 50 35.00000
6 1 x 60 33.33333

可以看到,每一行的d值都对应该行a值的所有c列数据的均值,比如a=1的c值是10、30、60,均值就是33.33333,完全符合你的需求。

扩展:多条件的"Mean-Ifs"

如果需要像Excel的SumIfs一样支持多个条件(比如同时满足a==x和b==y),只需要调整分组变量即可:

  • dplyr:group_by(a, b)
  • data.table:by = .(a, b)
  • 基础R:ave(df$c, list(df$a, df$b), FUN = mean)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:18:09