R对每行中的某些列求和
我有一个问题,但我相信这对一个非常熟悉R。 我有一个矩阵是3008x3008。我想要的是每行中每8列求和。所以基本上你会得到一个新的矩阵,现在是367 x 367 下面是一个小例子: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
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