这里是您需要的内容
df <- data.frame(A=1:5, B=seq(2,10,2), C=seq(3,15,3), d=seq(1,25,5), e=seq(3,31,6))
> df
A B C d e
1 1 2 3 1 3
2 2 4 6 6 9
3 3 6 9 11 15
4 4 8 12 16 21
5 5 10 15 21 27
z = combn(1:ncol(df),2)
> z
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 1 1 1 2 2 2 3 3 4
[2,] 2 3 4 5 3 4 5 4 5 5
y = apply(z,2,function(x){
df[,x[1]]-df[,x[2]]
})
结果:
> y
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] -1 -2 0 -2 -1 1 -1 2 0 -2
[2,] -2 -4 -4 -7 -2 -2 -5 0 -3 -3
[3,] -3 -6 -8 -12 -3 -5 -9 -2 -6 -4
[4,] -4 -8 -12 -17 -4 -8 -13 -4 -9 -5
[5,] -5 -10 -16 -22 -5 -11 -17 -6 -12 -6
矩阵 z 告诉你哪一对列被减去了。
你意识到如果数据框 df 有100列,所有的组合加起来总共有4950个。
df %>% mutate(ab = A - B, ac = A - C, bc = B - C)
,或者在其他语法中类似的操作。 - alistairecombn
的结果来进行子集操作,但通常不建议添加那么多列;最好将其转换为长格式。 - alistaire