在多维数组上使用apply

时间:2014-04-25 20:07:06

标签: arrays r matrix apply sapply

正常矩阵是二维矩阵。但是,我可以初步说明:

a<-array(0,dim=c(2,3,4,5))

这是一个2 * 4 * 5 * 3矩阵或数组。

命令

apply(a,c(2,3),sum)

将给出一个4 * 5数组,包含第1和第4维中元素的总和。

为什么呢?据我所知,在apply函数中,1表示行,2表示列,但3表示什么意思?

我们需要一些抽象。

1 个答案:

答案 0 :(得分:7)

理解数组apply的最简单方法是尝试一些示例。以下是从最后一个示例对象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。如果您将applyMARGIN=1一起使用,则会获得行总和(两个值因为有两行),如果您使用MARGIN=2,则会获得列总和(三个值,因为有三列),如果你使用MARGIN=3,你将获得数组第三维的总和(四个值,因为数组的第三维有四个级别)。

如果您为MARGIN指定了一个向量,就像c(2,3)一样,您可以得到每列的行数和第三维度的等级。请注意,在上面的示例中,applyMARGIN=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

这里学习的最好方法就是开始玩一些真实的矩阵。您的示例数据对于查看总和没有帮助,因为所有数组条目都为零。