我有一个尺寸为MxNxO的3D数组。对于尺寸为NxO的M个数组中的每一个,我想apply
一个函数myfunction
,它将NxO数组作为输入并返回一个NxO数组。
如果我这样做
apply(array, 1, myfunction)
输出是维度(N * O)xM的二维数组,而不是维度为MxNxO的二维数组。
例如,我们可以使用R的<{1}}函数。
这是一个3D数组
identity
并且> a <- array(1:20, c(2,2,5))
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
, , 3
[,1] [,2]
[1,] 9 11
[2,] 10 12
, , 4
[,1] [,2]
[1,] 13 15
[2,] 14 16
, , 5
[,1] [,2]
[1,] 17 19
[2,] 18 20
结果应该是相同的(根据我的需要),但它是一个2D数组:
apply
另外,我想保留数组每个维度上的标签(> apply(a,1,identity)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[4,] 7 8
[5,] 9 10
[6,] 11 12
[7,] 13 14
[8,] 15 16
[9,] 17 18
[10,] 19 20
本身保留这些标签)。
答案 0 :(得分:2)
您可能正在 plyr 包中寻找aaply
:
a <- array(1:20, c(2,2,5))
> aaply(a,1,identity)
, , = 1
X1 1 2
1 1 3
2 2 4
, , = 2
X1 1 2
1 5 7
2 6 8
, , = 3
X1 1 2
1 9 11
2 10 12
, , = 4
X1 1 2
1 13 15
2 14 16
, , = 5
X1 1 2
1 17 19
2 18 20
答案 1 :(得分:0)
如果您知道函数将返回的维度(就像您在简单示例中所做的那样),那么您可以vapply
。我也建议aaply
,虽然我更喜欢结果是2 2x5矩阵,而不是5 2x2矩阵(因为a[1, ,]
是2x5矩阵,所以这对我来说更有意义。)
dim <- c(x=2,y=2,z=5)
dim.n <- lapply(1:length(dim), function(x) paste(names(dim)[x], seq(len=dim[x]), sep="_"))
a <- array(1:20, dim, dim.n)
vapply(dimnames(a)[[1]], function(i) identity(a[i, ,]), a[1, ,])
# , , x_1
#
# z_1 z_2 z_3 z_4 z_5
# y_1 1 5 9 13 17
# y_2 3 7 11 15 19
#
# , , x_2
#
# z_1 z_2 z_3 z_4 z_5
# y_1 2 6 10 14 18
# y_2 4 8 12 16 20
这样做的主要优点是它是所有基础包,因此您不需要包含plyr
。 plyr
答案很好,只要您对返回维度的解释是正确的,或者不一定提前知道结果格式。
另外,我认识到这里的格式远不及aaply
那么干净,并且希望apply
尊重尺寸,所以不需要诉诸这些东西。我有very similar question last week。