我在 R 中有一个浮点数列表。对于给定的整数 N,我想找到列表中最大 N 值的索引。例如,如果 N 为 2,我想在列表中找到两个最大值的索引。我该怎么做呢?
我无法重新排列我的清单。这就是我需要索引的原因。
order(R, decreasing=TRUE)[1:N]
这是一个替代方案:
N <- 2
v <- c(3, 9, 11, 18, 5)
tail(order(v), N)
# [1] 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]]
}
您可能指的是向量而不是列表,这是一个示例:
v = c(1,7,4,3,9)
v[order(-v)][1:3]
#[1] 9 7 4
重新评论:
order(-v)[1:3]
#[1] 5 2 3