Индекс строки возврата Количество N Минимальное / максимальное значение для каждого столбца матрицы - PullRequest
1 голос
/ 24 мая 2019

Расширение этого поста: Возвращает индекс минимальной строки для каждого столбца матрицы

Предположим, у меня есть матрица, подобная примеру ниже, под названием m1:

m1<-matrix(6:1,nrow=3,ncol=2)
     [,1] [,2]
[1,]    6    3
[2,]    5    2
[3,]    4    1

Как вернуть номер строки индекса с наименьшим значением N для каждого столбца матрицы?

Например, если бы я хотел, чтобы индексная строка 2-й самой низкой строки в столбце [, 1] была бы равна 2 [2,], потому что 2-е самое высокое значение в столбце [, 1] равно 5.

Если бы я хотел 3-ю самую низкую строку в столбце [, 1], индекс строки был бы 1 [1,], потому что 6 - 3-е самое высокое значение в столбце [, 1].

1 Ответ

1 голос
/ 24 мая 2019

Чтобы получить индекс самых высоких и самых низких значений

apply(m1, 2, which.max)
apply(m1, 2, which.min)

Если нас интересуют 2-е наивысшее, 2-е наименьшее и т. Д.

apply(m1, 2, function(x) order(x)[2])

Или используйте sort с index.return = TRUE

apply(m1, 2, function(x) sort(x, index.return = TRUE))

и затем извлекаем индекс интереса

apply(m1, 2, function(x) {i1 <- sort(x, index.return = TRUE)$ix
                i1[i1 < 3]
     })

Если нам нужен индекс строки

getrowIndexEachCol <- function(mat, n, isMax = TRUE) {
   if(!isMax) mat <- -mat
   apply(mat, 2, function(x) {i1 <- rank(x)
            i1[i1 <= n]
       })
  }
 getrowIndexEachCol(m1, 2)

Различие будет замечено при использовании другого набора данных

m2 <- cbind(c(7, 3, 5, 8, 11), c(4, 8, 6, 5, 3))
getrowIndexEachCol(m2, 3)
...