普通矩阵是二维矩阵。但是,我可以初始化:
a<-array(0,dim=c(2,3,4,5))
这是一个2*4*5*3的矩阵,或者数组。
命令
apply(a,c(2,3),sum)
将给出一个 4*5 数组,包含第一维和第四维元素的总和。
为什么会这样?据我所知,在apply
函数中,1表示行,2表示列,但是这里的3是什么意思呢?
这里我们需要一些抽象。
最佳答案
了解数组上的应用
的最简单方法是尝试一些示例。这是从最后一个示例对象 in the documentation 修改而来的一些数据:
> z <- array(1:24, dim = 2:4)
> dim(z)
[1] 2 3 4
> apply(z, 1, function(x) sum(x))
[1] 144 156
> apply(z, 2, function(x) sum(x))
[1] 84 100 116
> apply(z, 3, function(x) sum(x))
[1] 21 57 93 129
这是怎么回事?那么,我们创建一个三维数组 z
。如果您将 apply
与 MARGIN=1
一起使用,您将获得行总和(两个值,因为有两行),如果您使用 MARGIN=2
,您获取列总和(三个值,因为有三列),如果您使用 MARGIN=3
,您将获得数组第三个维度的总和(四个值,因为数组的第三个维度有四个级别).
如果您为 MARGIN
指定一个向量,例如 c(2,3)
,您将获得第三维的每一列和级别的行总和。请注意在上面的示例中,apply
和 MARGIN=1
的结果分别是行总和和 MARGIN=2
的列总和, 在下面的结果中看到的矩阵:
> apply(z, c(2,3), function(x) sum(x))
[,1] [,2] [,3] [,4]
[1,] 3 15 27 39
[2,] 7 19 31 43
[3,] 11 23 35 47
如果您将所有维度指定为 MARGIN=c(1,2,3)
,您只需获得原始的三维对象:
> all.equal(z, apply(z, c(1,2,3), function(x) sum(x)))
[1] TRUE
在这里学习的最佳方法就是开始尝试一些真实的矩阵。您的示例数据对于查看总和没有帮助,因为所有数组条目均为零。
关于arrays - 在多维数组上使用 apply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302072/