我有一个矩阵/数据帧,我希望一次添加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
的最后一列的情况下执行此操作。
答案 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