使用dplyr按组获取阈值以上行的均值失败,求解决方案
按组计算阈值以上数据的均值(dplyr实现)
你的需求是按group分组后,计算每个组中b列数值大于4的行的均值,但之前的两段代码都没实现这个目标,问题出在逻辑上:
- 第一段代码
mean(b>4):b>4会生成逻辑向量(TRUE/FALSE),R中TRUE等价于1、FALSE等价于0,所以这个计算的是每组中b>4的行占比,不是数值的均值。 - 第二段代码
mean(which(b>4)):which(b>4)返回的是满足条件的行的索引位置,计算的是这些索引的平均值,和你要的b列数值完全无关。
正确实现方法
方法1:先过滤再分组汇总(最直观)
先筛选出b>4的行,再按组计算均值:
library(dplyr) df %>% filter(b > 4) %>% group_by(group) %>% summarise(mean_b = mean(b))
方法2:在summarise中直接筛选(无需提前过滤)
在mean()函数里直接对b列做条件筛选,同时加上na.rm = TRUE避免某组无符合条件数据时返回错误:
library(dplyr) df %>% group_by(group) %>% summarise(mean_b = mean(b[b > 4], na.rm = TRUE))
结果验证
用你提供的数据计算:
- group a的符合条件数值:4.154182、5.958000、5.689609、5.003576,均值约为5.2013
- group b的符合条件数值:5.127969、4.841127、5.796909,均值约为5.2553
两种方法都会得到这个正确结果。
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

