首页 > 解决方案 > 使用 mutate 计算表的 6 列之间的所有绝对差异?

问题描述

我有一个包含 6 列 Z1 到 Z6 的表,我想计算每列之间差异的绝对值。

到目前为止,我列举了 mutate 命令中的所有差异:

FactArray <- FactArray %>% mutate(diff12 = abs(Z1-Z2), 
                                  diff13 = abs(Z1-Z3),
                                  diff14 = abs(Z1-Z4),
                                  diff15 = abs(Z1-Z5),
                                  diff16 = abs(Z1-Z6),
                                  diff23 = abs(Z2-Z3),
                                  diff24 = abs(Z2-Z4),
                                  diff25 = abs(Z2-Z5),
                                  diff26 = abs(Z2-Z6),
                                  diff34 = abs(Z3-Z4),
                                  diff35 = abs(Z3-Z5),
                                  diff36 = abs(Z3-Z6),
                                  diff46 = abs(Z4-Z6),
                                  diff56 = abs(Z5-Z6))

但我意识到这很容易出错,如果我有不同数量的列,就必须重写。

有没有办法“自动”做到这一点?我的意思是,如果我考虑任意数量的列,它会自行调整?

最好的,

达米安

标签: rdplyr

解决方案


combn您可以使用并减去它们来生成所有可能的列组合。

cols <- paste0('Z', 1:6)
combn(cols, 2, function(x) abs(df[[x[1]]]  - df[[x[2]]]))

这里使用了一个小的可重现示例,还添加了适当的列名。

set.seed(123)
df <- data.frame(Z1 = sample(10, 4), Z2 = sample(10, 4), Z3 = sample(10,4))
cols <- paste0('Z', 1:3)
new_cols <- combn(cols, 2, paste0, collapse = "_")
df[new_cols] <- combn(cols, 2, function(x) abs(df[[x[1]]]  - df[[x[2]]]))
df

#  Z1 Z2 Z3 Z1_Z2 Z1_Z3 Z2_Z3
#1  3  6  6     3     3     0
#2 10  5  9     5     1     4
#3  2  4  2     2     0     2
#4  8 10  3     2     5     7

推荐阅读