向量的元素明智减法?

时间:2020-08-24 10:04:19

标签: r

我在R中有以下向量

x<-c(5,7,8,20,11,30)

我想得到所有可能的减法xi-xj1<=i<j<=6。我使用了outer函数,但是得到了对角线为零的矩阵。我不想将xi-xji=j一起使用。另外,我想要一个向量,而不是矩阵。

3 个答案:

答案 0 :(得分:4)

您可以使用outerlower.triupper.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

或者,您可以使用seqrep生成索引。

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 - bb - 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)))))
相关问题