我有一个矩阵,定义为数组元素之间的成对差异:
a <- as.matrix(dist(c(1,2,3,4,5)))
我需要在不循环的情况下计算前两个元素、前三个元素等之间的成对差的总和,即,我需要到达阵列:
v <- c(1,4,10,20)
尝试
head(cumsum(cumsum(1:5)),-1)
#[1] 1 4 10 20
我不知道你是否真的想调用累积和函数两次,因为我认为"前两个元素、前三个元素等之间的成对差的总和"应该会导致:
c(1, 3, 6, 10)
无论如何,这应该也适用于非顺序x
,用于您所需的输出:
> cumsumdiff <- function (x) cumsum(cumsum(sapply(x[-1], `-`, x[1])))
> cumsumdiff(1:5)
[1] 1 4 10 20
或者基于@Jota的建议,使用距离矩阵:
> cumsumdiff <- function(x) cumsum(cumsum(unname(as.matrix(dist(x))[1, -1])))
> cumsumdiff(1:5)
[1] 1 4 10 20