我有一个包含 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))
Run Code Online (Sandbox Code Playgroud)
但我意识到这很容易出错,如果我有不同数量的列,则必须重写。
有没有办法“自动”做到这一点?我的意思是,如果我考虑任意数量的列,它会以某种方式自行调整?
最好的事物,
达米安
您可以使用combn和减去它们来生成所有可能的列组合。
cols <- paste0('Z', 1:6)
combn(cols, 2, function(x) abs(df[[x[1]]] - df[[x[2]]]))
Run Code Online (Sandbox Code Playgroud)
这里使用了一个小的可重现示例,还添加了适当的列名。
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
Run Code Online (Sandbox Code Playgroud)