如何在R中返回向量中的前5个最大值?

45

我有一个向量,可以返回最高和最低值,但如何返回前五个最高值?是否有简单的一行代码解决方案?

4个回答

77
> a <- c(1:100)
> tail(sort(a),5)
[1]  96  97  98  99 100

15
使用head(sort(a, decreasing=TRUE), 5)可以将向量a按从大到小的顺序排序,并返回前5个最大的值。 - Marek
tail 比 head 稍微快一点,而且 decreasing = TRUE
x <- rnorm(50000000) system.time(tail(sort(x), 5)) user system elapsed 22.64 0.25 22.95 system.time(head(sort(x, decreasing = TRUE), 5)) user system elapsed 23.26 0.20 23.51
- Thierry
@Thierry 你应该运行多次并取平均时间。因为根据我的模拟,统计学上没有区别。 - Marek
我获得了用户自身和经过时间平均快2%的时间。sys.self的增益为8%。但增益的相关性取决于应用程序。 - Thierry
使用sort(x, method='quick')的速度要快得多,但是David在下面使用partial参数的解决方案甚至更快。 - Tommy

25
x[order(x)[1:5]]

应该是 x[order(x, decreasing = TRUE)[1:5]],但是被接受的答案也不错。 - kennyB

4

是的,head( X, 5) 其中 X 是您排序后的向量。


3
tail(sort.int(x, partial=length(x) - 4), 5)

使用带有partial参数的sort.int具有潜在的优势,即通过不进行完全排序(可能)更快。但实际上,我的实现似乎略慢。也许这是因为使用了shell sort而不是quick sort?
> x <- 1:1e6
> system.time(replicate(100, tail(sort.int(x, partial=length(x) - 4), 5)))
   user  system elapsed 
  4.782   0.846   5.668
> system.time(replicate(100, tail(sort(x), 5)))
   user  system elapsed 
  3.643   0.879   4.854 

如果你使用x<-runif(1e6)的话,你会看到好处。请注意,你得到的那5个值确实是最高的5个,但不一定是按排序顺序排列的。 - Tommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接