对矩阵中的每 N 个值求和
Sum Every N Values in Matrix
所以我查看了之前发布的这个问题,该问题用于对矩阵中每一行中的每 2 个值求和。这是 link:
sum specific columns among rows. I also took a look at another question here: 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
要对每一行中连续的 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
我会做类似于 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
将矩阵转换为数组并使用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 个值求和。这是 link: sum specific columns among rows. I also took a look at another question here: 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
要对每一行中连续的 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
我会做类似于 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
将矩阵转换为数组并使用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:当然可以避免创建这么多中间对象。它们用于教学目的。