用于将向量向下折叠为不同大小的求和组的R函数



我有一个长向量(添加一个名为original_data的子集作为可复制的示例),我想快速将向量分解为分组汇总的连续元素,在本例中为4组。例如,如果我有向量:

original_data <- c(1, 2, 3, 4, 5, 6, 7, 8)

我希望这个崩溃为:

collapsed_data <- c(10, 26)

由于1+2+3+4=10和5+6+7+8=26,我将四组相加。我知道我的输入向量的长度是四的倍数,所以我想知道如何快速将向量分解为四个求和的组,在这些组中求和是连续的。

这种方法有效:

collapsed_data <- c()
for (i in (1:(length(original_data)/4))) {
collapsed_data[i] <- sum(c(original_data[1+4*(i-1)],
original_data[2+4*(i-1)],
original_data[3+4*(i-1)],
original_data[4+4*(i-1)]))
}

结果是:

collapsed_data <- c(10, 26)

但它似乎效率很低。有没有更好的方法可以推广到不同大小的组(例如5个)?

我们可以使用gl创建一个大小为4的分组变量,并在其中一个分组函数中使用它

f1 <- function(vec, n) {
n1 <- length(vec)
unname(tapply(vec, as.integer(gl(n1, n, n1)), FUN = sum))
}
f1(original_data, 4)
#[1] 10 26
f1(original_data, 5)
#[1] 15 21
f1(original_data, 6)
#[1] 21 15

或使用%/%

n <- 4
grp <- (seq_along(original_data)-1) %/% n + 1
unname(tapply(original_data, grp, sum))

或使用rep

grp <- rep(seq(length(original_data)/2), each = n,
length.out = length(original_data))

可以将byrep(. ,each=4)生成的索引向量一起使用

as.vector( by(original_data, 
INDICES = list(idx=rep(1:(length(original_data)/4), each=4)),
FUN = sum) )
[1] 10 26

另一个tapply选项以及ceiling

> tapply(original_data, ceiling(seq_along(original_data) / 4), sum)
1  2
10 26

colSums+matrix

colSums(matrix(`length<-`(original_data, ceiling(length(original_data) / 4) * 4), 4), na.rm = TRUE)
# [1] 10 26

最新更新