2014-04-25 57 views
1

正常矩阵将是二维矩阵。但是,我可以初始化:使用适用于多维数组

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是什么意思?

这里我们需要一些抽象。

+0

1:n尺寸适用于从行开始的工作。 –

回答

4

理解数组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 

最好的办法就是开始与一些真正的矩阵玩耍。您的示例数据对于查看总和没有帮助,因为所有数组条目均为零。

+0

我没有得到你的意思,“如果你为MARGIN指定一个向量,就像c(2,3)一样,你可以得到每列和第三维的行的总和。” – GeekCat

+1

@GeekCat与计算跨行或跨列的边际总和,它计算在这两个维度上的数组的边际总和(用'c(2,3)'它实际上是列和数组的第三维,但希望你能看到这个点)。我认为,很难用言语表达,所以看一些例子是非常有用的。 – Thomas