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

如何用dplyr计算R数据框中各重复组的组间res差值?

按分组计算多组间差值的实现方法

原始数据

df = data.frame(
  repetition = c(1,1,1,2,2,2),
  group = c("a", "b", "c", "a", "b", "c"),
  res = c(10,8,9,12,9,10)
)

数据预览:

repetition group res
1          1     a  10
2          1     b   8
3          1     c   9
4          2     a  12
5          2     b   9
6          2     c  10

需求说明

针对每个repetition,计算不同group之间的res差值(如a-b、a-c、b-c),输出以差值为列、repetition为行的结果表。


方法一:dplyr + tidyr(适配动态新增组)

这种方法通过生成所有组的两两组合自动计算差值,后续新增组时无需修改代码:

library(dplyr)
library(tidyr)

# 转换为宽格式,每个group对应一列res值
df_wide <- df %>%
  pivot_wider(names_from = group, values_from = res)

# 获取所有组名的两两组合(x-y的顺序)
groups <- setdiff(colnames(df_wide), "repetition")
group_pairs <- combn(groups, 2, simplify = FALSE)

# 遍历组合计算差值并添加列
result <- df_wide %>%
  mutate(
    across(
      group_pairs,
      ~ .x[[1]] - .x[[2]],
      .names = "diff_{.x[[1]]}_{.x[[2]]}"
    )
  ) %>%
  select(repetition, starts_with("diff_"))

print(result)

运行输出:

repetition diff_a_b diff_a_c diff_b_c
1          1        2        1       -1
2          2        3        2       -1

方法二:手动计算(适合固定组场景)

如果group数量固定且不会新增,可以直接显式计算差值,代码更简洁:

library(dplyr)
library(tidyr)

df %>%
  pivot_wider(names_from = group, values_from = res) %>%
  mutate(
    diff_a_b = a - b,
    diff_a_c = a - c,
    diff_b_c = b - c
  ) %>%
  select(repetition, diff_a_b, diff_a_c, diff_b_c)

此方法同样能得到目标结果,但扩展性较差,新增组时需要手动添加对应差值计算语句。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:02