18

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

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

4

4 に答える 4

26
order(R, decreasing=TRUE)[1:N]
于 2013-07-12T16:41:51.680 に答える
5

代替案は次のとおりです。

N <- 2
v <- c(3,  9, 11,  18,  5)
tail(order(v), N)
# [1] 3 4
于 2013-07-12T16:51:22.450 に答える
3

他のすべての現在の回答では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]]
}
于 2018-09-27T09:33:49.127 に答える