我有一个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),])
}
答案 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列(定义变量T
和R
,如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