R对每行中的某些列求和

R对每行中的某些列求和,r,matrix,sum,aggregate,R,Matrix,Sum,Aggregate,我有一个问题,但我相信这对一个非常熟悉R。 我有一个矩阵是3008x3008。我想要的是每行中每8列求和。所以基本上你会得到一个新的矩阵,现在是367 x 367 下面是一个小例子: C.1 C.2 C.3 C.4 C.5 C.6 row1 1 2 1 2 5 6 row1 1 2 3 4 5 6 row1 2 6 3 4 5 6 row1 1 2 3

我有一个问题,但我相信这对一个非常熟悉R。 我有一个矩阵是3008x3008。我想要的是每行中每8列求和。所以基本上你会得到一个新的矩阵,现在是367 x 367

下面是一个小例子:

           C.1 C.2 C.3 C.4 C.5 C.6
    row1    1   2   1   2   5   6
    row1    1   2   3   4   5   6
    row1    2   6   3   4   5   6
    row1    1   2   3   4   10   6
假设我想对每行中每3列的数据求和,我想得到:

           C.1 C.2
    row1    4   13
    row1    6   15
    row1   11   15
    row1    6   20
#创建示例数据:

df将矩阵转换为数组,然后使用
apply
rowsumes

mat <- structure(c(1L, 1L, 2L, 1L, 2L, 2L, 6L, 2L, 1L, 3L, 3L, 3L, 2L, 4L, 4L, 4L, 5L, 5L, 5L, 10L, 6L, 6L, 6L, 6L), 
                 .Dim = c(4L, 6L), 
                 .Dimnames = list(c("row1", "row2", "row3", "row4"), c("C.1", "C.2", "C.3", "C.4", "C.5", "C.6")))

n <- 3 #this needs to be a factor of the number of columns
a <- array(mat,dim=c(nrow(mat),n,ncol(mat)/n))
apply(a,3,rowSums)
#      [,1] [,2]
# [1,]    4   13
# [2,]    6   15
# [3,]   11   15
# [4,]    6   20
mat
#m是您的矩阵

n另一种选择:尽管它可能没有那么优雅

mat <- structure(c(1L, 1L, 2L, 1L, 2L, 2L, 6L, 2L, 1L, 3L, 3L, 3L, 2L, 4L, 4L, 4L, 5L, 5L, 5L, 10L, 6L, 6L, 6L, 6L), 
                 .Dim = c(4L, 6L), 
                 .Dimnames = list(c("row1", "row1", "row1", "row1"), c("C.1", "C.2", "C.3", "C.4", "C.5", "C.6")))

new<- data.frame((mat[,1]+mat[,2]+mat[,3]),(mat[,4]+mat[,5]+mat[,6]))
names(new)<- c("C.1","C.2")
new

mat避免在循环中使用
cbind
(非常慢),也不需要在这里使用
for
(副作用)。你们太棒了!谢谢你的快速回复!这正是我需要的!3008x3008矩阵很没用,不是吗?
# m is your matrix
n <- 8
grp <- seq(1, ncol(m), by=n)
sapply(grp, function(x) rowSums(m[, x:(x+n-1)]))
mat <- structure(c(1L, 1L, 2L, 1L, 2L, 2L, 6L, 2L, 1L, 3L, 3L, 3L, 2L, 4L, 4L, 4L, 5L, 5L, 5L, 10L, 6L, 6L, 6L, 6L), 
                 .Dim = c(4L, 6L), 
                 .Dimnames = list(c("row1", "row1", "row1", "row1"), c("C.1", "C.2", "C.3", "C.4", "C.5", "C.6")))

new<- data.frame((mat[,1]+mat[,2]+mat[,3]),(mat[,4]+mat[,5]+mat[,6]))
names(new)<- c("C.1","C.2")
new