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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:44