web-dev-qa-db-ja.com

Rのリストで最大のN要素を見つける方法は?

Rにfloatのリストがあります。与えられた整数Nに対して、リスト内の最大のN値のインデックスを見つけたいと思います。したがって、たとえば、Nが2の場合、リスト内の2つの最大値のインデックスを見つけたいと思います。どうすればよいですか?

リストを並べ替えることができません。これが私がインデックスを必要とする理由です。

16
user2560984
order(R, decreasing=TRUE)[1:N]
19
Hong Ooi

別の方法は次のとおりです。

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

他のすべての現在の回答には、O(M log M)時間で実行されるorderへの呼び出しが必要です。 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]]
}
2
John

あなたはおそらくリストではなくベクトルを意味します、そしてここに例があります:

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

再コメント:

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