向量的元素相减

  • 本文关键字:相减 元素 向量 r
  • 更新时间 :
  • 英文 :


我在R 中有以下向量

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

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

您可以使用lower.triupper.triouter的输出进行子集设置。

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

是的,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下失败。

高阶函数;不如上面简洁/可读,但由于某种原因更快。

Filter(function(y) {y != 0},
do.call("c", (Map(function(i){y <- x - x[i]; y[i:length(x)]}, seq_along(x)))))

最新更新