在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
相关产品推荐
相关产品推荐

