先举个例子看看是不是你要的效果。
<br />
numbers <- array(runif(4*5*6), dim=c(4,5,6))<br />
因为直接print(numbers)的话,R会先根据最后一个维度展开,不利于我们理解,因此为了更加直观,我们做一个变换,从第一个维度出发来看看
<br />
aaply(numbers,c(2,3),identity)<br />
[data]
, , = 1</p>
X2
X1 1 2 3 4 5 6
1 0.9554013 0.3577168 0.17238963 0.9513130 0.80726269 0.5377590
2 0.5244636 0.2280606 0.24560516 0.1106902 0.82069746 0.3531504
3 0.1078239 0.7993830 0.66509447 0.7428336 0.07352746 0.5854244
4 0.1629172 0.3992051 0.85510579 0.9274076 0.43287995 0.2630826
5 0.4699560 0.5023621 0.08165722 0.2506401 0.54997518 0.2363892
, , = 2
X2
X1 1 2 3 4 5 6
1 0.56909622 0.2324867 0.7033420 0.1108749 0.6239063 0.4117019
2 0.40131505 0.3803190 0.9072425 0.1661538 0.1685532 0.9695568
3 0.82104195 0.5136715 0.7264454 0.8095270 0.4604579 0.5595459
4 0.02706862 0.4781465 0.1928556 0.1918607 0.3978122 0.6789482
5 0.58388568 0.7495555 0.3431833 0.6464418 0.1103721 0.1670323
, , = 3
X2
X1 1 2 3 4 5 6
1 0.98720479 0.4111881 0.4980915 0.5720757 0.5284520 0.52466836
2 0.35618282 0.9641709 0.8080521 0.3278148 0.6295225 0.74925400
3 0.31963976 0.4485735 0.4897585 0.9948864 0.8583575 0.09362186
4 0.01323527 0.8457155 0.1854459 0.0187813 0.1200499 0.74184401
5 0.11880476 0.6495463 0.9520370 0.9273993 0.1685999 0.43183069
, , = 4
X2
X1 1 2 3 4 5 6
1 0.69418901 0.06808905 0.59580539 0.9120634 0.3099613 0.6734968
2 0.94569123 0.54685101 0.12532465 0.6582847 0.7360841 0.5171920
3 0.50035943 0.29201334 0.04371302 0.3520716 0.6861547 0.1921664
4 0.45296127 0.03899780 0.88901874 0.3202546 0.3460340 0.1850456
5 0.06921993 0.66043231 0.59763469 0.6011038 0.9459926 0.9709003
[/data]
按照楼主的意思,这里把前2个矩阵相加,后2个矩阵相加。
<br />
aaply(numbers,c(2,3),function(x){<br />
tapply(x,rep(1:2,each=2),sum)<br />
})<br />
第一个维度缩减为2.
[data]
, , = 1</p>
X2
X1 1 2 3 4 5 6
1 1.5244975 0.5902035 0.8757317 1.0621880 1.4311690 0.9494609
2 0.9257787 0.6083796 1.1528476 0.2768440 0.9892506 1.3227072
3 0.9288659 1.3130544 1.3915399 1.5523606 0.5339854 1.1449703
4 0.1899858 0.8773516 1.0479614 1.1192683 0.8306922 0.9420308
5 1.0538417 1.2519176 0.4248405 0.8970819 0.6603473 0.4034215
, , = 2
X2
X1 1 2 3 4 5 6
1 1.6813938 0.4792771 1.0938969 1.4841390 0.8384133 1.1981652
2 1.3018740 1.5110219 0.9333767 0.9860995 1.3656066 1.2664460
3 0.8199992 0.7405868 0.5334716 1.3469580 1.5445122 0.2857882
4 0.4661965 0.8847134 1.0744647 0.3390359 0.4660839 0.9268896
5 0.1880247 1.3099786 1.5496716 1.5285030 1.1145924 1.4027309
[/data]
如果这个是你要的效果,把我刚刚的代码稍加修改即可。
<br />
numbers <- array(runif(20000*10*27), dim=c(20000,10,27))<br />
numbers_sum <- aaply(numbers,c(2,3),function(x){<br />
tapply(x,rep(1:(20000/20),each=20),sum)<br />
})<br />
dim(numbers_sum)<br />
</p>
[data]
[1] 10 27 1000
[/data]
发现这个维度信息和你想要的不一样。因为这种方法是为了更加直观化,所以我们只需要把维度再转回来即可。
<br />
numbers_sum <- aaply(numbers_sum,c(3),identity)<br />
dim(numbers_sum)<br />
</p>
[data]
[1] 1000 10 27
[/data]