【发布时间】:2013-07-12 16:39:31
【问题描述】:
我在 R 中有一个浮点数列表。对于给定的整数 N,我想找到列表中最大 N 值的索引。例如,如果 N 为 2,我想在列表中找到两个最大值的索引。我该怎么做呢?
我无法重新排列我的清单。这就是我需要索引的原因。
【问题讨论】:
标签: r list sorting indexing max
我在 R 中有一个浮点数列表。对于给定的整数 N,我想找到列表中最大 N 值的索引。例如,如果 N 为 2,我想在列表中找到两个最大值的索引。我该怎么做呢?
我无法重新排列我的清单。这就是我需要索引的原因。
【问题讨论】:
标签: r list sorting indexing max
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]
请注意,这不会处理列表中的关系。有更长的讨论here。
将数字数据存储在向量而不是列表中是惯用的。因此上面调用了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
【讨论】: