Ранговые значения массива в R с apply - PullRequest
1 голос
/ 25 февраля 2020

Мне нужно ранжировать значения массива по третьему топору. У меня есть такой массив:

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 возвращает мне другой массив, что странно, потому что она возвращает матрицу, когда я использую другие функции, такие как mean, max или sort.

Я проверил apply(a, c(1,2), print), и он печатает вектор, который меня интересует в ранжировании (например, на первой итерации выведите 1 11 21).

Я могу закодировать это с помощью for-l oop, но, по крайней мере, мне интересно, что именно является проблемой в данном случае.

# 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]
  }
}

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Вы можете использовать [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
1 голос
/ 25 февраля 2020

Попробуйте

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
...