R中没有for循环的多个列的重复和

时间:2015-03-18 14:31:20

标签: r

我有一个T * 12行和3列的矩阵。 对于每一列,我想总结第一组12行,然后是第二组12行,依此类推,直到最后一组(T = 20)为12行。

我设法使用for循环(下面),但我想在没有循环的情况下完成它。

T=20
for (i in 1:T){
j <- (i-1)*12+1
Ryear[i,] <- colSums(R[j:(j+11),])
}

5 个答案:

答案 0 :(得分:2)

您可以将矩阵转换为&#39;数组&#39;然后进行总结&#39;

R1 <- R
dim(R1) <- c(12, 20, 3)
res <- apply(aperm(R1, c(1,3,2)),2, colSums)
identical(res, Ryear) #Ryear based on the results from the OP's code
#[1] TRUE

数据

 set.seed(24)
 R <- matrix(sample(1:20, 20*12*3, replace=TRUE), nrow=20*12, ncol=3)
 Ryear <- matrix(,nrow=20, ncol=3)

答案 1 :(得分:2)

基于@akrun的样本数据的dplyr方法:

library(dplyr)

as.data.frame(R) %>% 
  group_by(grp = rep(seq_len(20), each = 12)) %>% 
  summarise_each(funs(sum))   # add %>% select(-grp) to drop the "grp" column

#Source: local data frame [20 x 4]
#
#   grp  V1  V2  V3
#1    1 136 153 144
#2    2 105 118 155
#3    3  94 149 122
#4    4 110 134 133
#5    5 120 114 102
#6    6 118 122 133
#7    7 116  96 120
#8    8 130 113 113
#9    9 113 140  97
#10  10 135 152 114
#11  11 148 139 148
#12  12 100 153  92
#13  13 136  99 141
#14  14 100 132 124
#15  15 121 139 133
#16  16 124 115 140
#17  17 168 127 129
#18  18 108 110  89
#19  19 115 152 108
#20  20 105 143 134

答案 2 :(得分:1)

这是一种求和方式,例如:第1列(定义变量TR,如OP)

rowSums(matrix(R[, 1], nrow = T, byrow = TRUE))

要对R的所有列执行此操作,请使用sapply或循环,具体取决于您希望最终结果的样子,例如

sapply(1:ncol(R), function(i) rowSums(matrix(R[, i], nrow = T, byrow = TRUE)))

答案 3 :(得分:1)

忽略rowsum的另一个想法(使用akrun的数据):

n = 12
rowsum(R, rep(seq_len(nrow(R) / n), each = n))
#   [,1] [,2] [,3]
#1   136  153  144
#2   105  118  155
#3    94  149  122
#4   110  134  133
#5   120  114  102
#6   118  122  133
#7   116   96  120
#8   130  113  113
#9   113  140   97
#10  135  152  114
#11  148  139  148
#12  100  153   92
#13  136   99  141
#14  100  132  124
#15  121  139  133
#16  124  115  140
#17  168  127  129
#18  108  110   89
#19  115  152  108
#20  105  143  134

答案 4 :(得分:0)

此代码创建一个名为group的新列,对应于每个T值(12行组)。然后,您可以拆分此组以获取每个T值的数据框列表:

R$group <- trunc(c(0:(nrow(R)-1)) / 12)            # assign T group value
R.groups <- split(R, R$group)                      # split 'R' by group
R.sums <- lapply(R.groups, function(x) colSums(x)) # colSums() on each group