我在R中有以下向量
x<-c(5,7,8,20,11,30)
我想得到所有可能的减法xi-xj
,1<=i<j<=6
。我使用了outer
函数,但是得到了对角线为零的矩阵。我不想将xi-xj
与i=j
一起使用。另外,我想要一个向量,而不是矩阵。
答案 0 :(得分:4)
您可以使用outer
或lower.tri
对upper.tri
的输出进行子集化。
y <- outer(x, x, '-')
y[lower.tri(y)]
# [1] 2 3 15 6 25 1 13 4 23 12 3 22 -9 10 19
或者,您可以使用seq
和rep
生成索引。
k <- seq(length(x) - 1, 1)
i <- rep(seq_along(k), k)
j <- sequence(k) + i
x[j] - x[i]
# [1] 2 3 15 6 25 1 13 4 23 12 3 22 -9 10 19
答案 1 :(得分:2)
是的,outer
生成了一个矩阵,在两个方向(a - b
和b - a
)上都有所有可能的组合,在这种情况下是不需要的。
也许您可以使用combn
:
combn(x, 2, diff)
#[1] 2 3 15 6 25 1 13 4 23 12 3 22 -9 10 19
就像@Rui Barradas指出的那样,outer
可能不是正确的解决方案,因为它在条件1<=i<j<=6
下失败。
答案 2 :(得分:0)
高阶函数;比上述格式更简洁/更易读,但由于某些原因更快。
Filter(function(y) {y != 0},
do.call("c", (Map(function(i){y <- x - x[i]; y[i:length(x)]}, seq_along(x)))))