使用dplyr::mutate排除当前同类观测计算非同类Y值均值
嘿,我来帮你搞定这个dplyr的需求!这里有两种实用的实现方式,既能得到你想要的结果,还能适配不同场景:
方法一:高效推导法(大数据集首选)
我们可以通过全局统计量+分组统计量来推导其他组的均值,不用逐行筛选,效率更高:
library(dplyr) # 先构造你的示例数据集 df <- tibble( X = c("A", "A", "B", "B", "C", "C"), Y = c(1, 2, 3, 4, 5, 6) ) df %>% # 先按X分组,计算每组的均值和样本量 group_by(X) %>% mutate( group_avg = mean(Y), group_count = n() ) %>% ungroup() %>% # 计算全局的均值和总样本量 mutate( total_avg = mean(Y), total_count = n(), # 核心公式:(总总和 - 当前组总和) / (总样本量 - 当前组样本量) Mean = (total_avg * total_count - group_avg * group_count) / (total_count - group_count) ) %>% # 保留需要的列 select(X, Y, Mean)
方法二:直观筛选法(小数据集友好)
如果更看重逻辑的直观性,直接按字面意思,逐行筛选出当前X以外的所有Y值计算均值:
df %>% rowwise() %>% mutate( Mean = mean(filter(df, X != cur_data()$X)$Y) ) %>% ungroup()
最终结果
两种方法都会输出你预期的结果:
# A tibble: 6 × 3 X Y Mean <chr> <dbl> <dbl> 1 A 1 4.5 2 A 2 4.5 3 B 3 3.5 4 B 4 3.5 5 C 5 2.5 6 C 6 2.5
小提示
- 方法一的推导逻辑:其他组的总和等于所有Y的总和减去当前组Y的总和,样本量是总样本量减去当前组的样本量,两者相除就是目标均值,这种方法在大数据集上运行速度会快很多。
- 方法二更贴近你描述的“所有X不等于当前行X的Y值的平均值”的字面逻辑,适合小数据集或者需要快速理解代码的场景。
内容的提问来源于stack exchange,提问作者mrmajacuze
相关产品推荐
相关产品推荐

