Как найти наибольшие N элементов в списке в R?

У меня есть список с плавающей точкой в R. Для заданного целого числа N я хочу найти индексы самых больших N значений в моем списке. Так, например, если N равно 2, я хочу найти индексы двух самых больших значений в моем списке. Как мне это сделать?

Я не могу изменить свой список. Вот почему мне нужны индексы.

Ответ 1

order(R, decreasing=TRUE)[1:N]

Ответ 2

Вот альтернатива:

N <- 2
v <- c(3,  9, 11,  18,  5)
tail(order(v), N)
# [1] 3 4

Ответ 3

Вероятно, вы имеете в виду вектор, а не список, и вот пример:

v = c(1,7,4,3,9)
v[order(-v)][1:3]
#[1] 9 7 4

Re comment:

order(-v)[1:3]
#[1] 5 2 3

Ответ 4

Все остальные текущие ответы требуют вызова по order который будет выполнен за O (M log M). Если N намного меньше, чем общее количество элементов M, более быстрый способ состоит в том, чтобы частично отсортировать список и затем извлечь индексы, большие или равные N-му наибольшему. Это имеет O (M + N log N) и будет намного быстрее для больших M.

v <- list(1,7,4,3,9,1,2,3,0,1,2)
vec <- unlist(v)
N <- 3
partial <- length(v) - N + 1
Nth <- sort(vec, partial = partial)[partial]
indexes <- which(vec >= Nth)
vec[indexes]

Обратите внимание, что это не касается связей в списке. Существует более длительное обсуждение здесь.

Идиоматично хранить числовые данные в векторе, а не в списке. Отсюда и призыв к unlist выше.

Как функция, это может быть реализовано так:

maxn <- function(x, n) {
  partial <- length(x) - n + 1
  x[x >= sort(x, partial = partial)[partial]]
}