对矩阵中的每N个值求和

时间:2015-07-28 14:36:51

标签: r matrix rows apply

所以我看了之前发布的这个问题,用于汇总矩阵中每行的每2个值。链接在这里: sum specific columns among rows。我还看了一下这里的另一个问题:R Sum every k columns in matrix这与我的相似。我无法在这种情况下得到解决方案。这是我正在使用的代码...

y <- matrix(1:27, nrow = 3)
y

m1 <- as.matrix(y)
n <- 3
dim(m1) <- c(nrow(m1)/n, ncol(m1), n)
res <- matrix(rowSums(apply(m1, 1, I)), ncol=n)
identical(res[1,],rowSums(y[1:3,]))


sapply(split.default(y, 0:(length(y)-1) %/% 3), rowSums)

我在申请时收到错误消息。所需的输出是具有以下值的矩阵:

      [,1] [,2] [,3]
[1,]   12   39   66
[2,]   15   42   69
[3,]   18   45   72

3 个答案:

答案 0 :(得分:2)

要对每行中的n元素的连续集合求和,您只需编写一个执行求和的函数并将其应用于每一行:

n <- 3
t(apply(y, 1, function(x) tapply(x, ceiling(seq_along(x)/n), sum)))
#       1  2  3
# [1,] 12 39 66
# [2,] 15 42 69
# [3,] 18 45 72

答案 1 :(得分:2)

将矩阵转换为数组并使用colSums(由@nongkrong建议):

y <- matrix(1:27, nrow = 3)
n <- 3

a <- y
dim(a) <- c(nrow(a), ncol(a)/n, n)
b <- aperm(a, c(2,1,3))
colSums(b)
#     [,1] [,2] [,3]
#[1,]   12   39   66
#[2,]   15   42   69
#[3,]   18   45   72

当然,这假定ncol(y)可以被n整除。

PS:您当然可以避免创建这么多中间对象。他们是出于教学目的。

答案 2 :(得分:1)

我会做类似于OP的事情 - 在矩阵的子集上应用rowSums

n  = 3
ng = ncol(y)/n
sapply( 1:ng, function(jg) rowSums(y[, (jg-1)*n + 1:n ]))

#      [,1] [,2] [,3]
# [1,]   12   39   66
# [2,]   15   42   69
# [3,]   18   45   72