R“将”应用于多维数组,该函数本身返回一个数组

时间:2014-01-26 18:40:03

标签: r

我有一个尺寸为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 本身保留这些标签)。

2 个答案:

答案 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

这样做的主要优点是它是所有基础包,因此您不需要包含plyrplyr答案很好,只要您对返回维度的解释是正确的,或者不一定提前知道结果格式。

另外,我认识到这里的格式远不及aaply那么干净,并且希望apply尊重尺寸,所以不需要诉诸这些东西。我有very similar question last week