使用 apply 在 R 中排列数组的值

Rank values of an array in R with apply

我需要在第三个轴上对数组的值进行排序。 我有一个这样的数组:

a <- array(c(1:9,11:19,21:29),dim = c(3,3,3))

预期结果是一个排名第一的矩阵,我希望这样计算:apply(X = a, MARGIN = c(1,2), FUN = rank)[, ,1]

# expected result because a[,,1] is the minimal value of my array
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1

然而 apply 函数 return 我是另一个数组,这很奇怪,因为当我使用 mean、[=16= 等其他函数时它 return 是一个矩阵] 或 sort

我检查过 apply(a, c(1,2), print) 并且它打印了我感兴趣的排名向量(例如它在第一次迭代时打印 1 11 21)。

我可以用 for 循环对此进行编码,但至少我很好奇这种情况下到底是什么问题。

# The for loop to obtain the good result
a2 <- a[,,1]
for(i in seq(dim(a)[1])){
  for(j in seq(dim(a)[2])){
    a2[i,j] <- rank(a[i,j,])[1]
  }
}

提前致谢!

尝试

apply(a, c(1,2), function(x) rank(x)[1])

#      [,1] [,2] [,3]
# [1,]    1    1    1
# [2,]    1    1    1
# [3,]    1    1    1

您可以使用 [1,,] 而不是 [,,1],即

apply(X = a, MARGIN = c(1,2), FUN = rank)[1,,]

这样

> apply(X = a, MARGIN = c(1,2), FUN = rank)[1,,]
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    1    1    1