一次总和k列的矩阵

时间:2016-02-24 02:22:03

标签: r

我有一个矩阵/数据帧,我希望一次添加k列。然而,扭曲是列数不是k的倍数。以下是k = 5的示例。

set.seed(1)
m=matrix(rnorm(7*12),nrow = 7)
col_group=1:5
ncol_agg = ceiling(dim(m)[2]/length(col_group))
a=matrix(nrow=dim(m)[1],ncol=ncol_agg)
for (i in 1:ncol_agg){
  cols = col_group+(i-1)*length(col_group)
  if (cols[length(cols)]>dim(m)[2])
    cols = cols[1]:dim(m)[2]
  a[,i] = rowSums(m[,cols])
}

我能找到的结果答案是( 来自:Looping across 10 columns at a time in R

k=5
colpicks <- seq(k,dim(m)[2],by=k)
mapply(function(start,stop) rowSums(m[,start:stop]), colpicks-k, colpicks)

但是这只会让我直到5的最后一个倍数,即不会将m中剩下的2列(第11列和第12列)相加。

最有效的方法是在不丢失a的最后一列的情况下执行此操作。

1 个答案:

答案 0 :(得分:2)

您可以修改原始答案以更改colpicks变量。 E.g:

k <- 5
starts <- seq(1, ncol(m), k) 
stops  <- c(tail(starts - 1, -1), ncol(m) )
starts
#[1]  1  6 11
stops
#[1]  5 10 12
mapply(function(start,stop) rowSums(m[,start:stop]), starts, stops)

#          [,1]       [,2]        [,3]
#[1,]  1.540788  0.8238572  0.47661488
#[2,]  1.206998 -1.2269287 -0.63560511
#[3,] -1.787879 -0.6015836  0.02120541
#[4,]  4.567936 -1.2063633 -1.50276636
#[5,]  1.872115  3.8655672 -1.38881202
#[6,] -1.057408  2.1510464  1.46953323
#[7,] -3.656105  4.4770430 -1.96685867