如何用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
相关产品推荐
相关产品推荐

