如何在R中获得其索引的前n个值?

时间:2015-09-14 13:14:14

标签: r

我有一个只有一列的数据框,我想用它的索引找到最大的三个值。例如,我的数据框df如下所示:

  distance
1 1
2 4
3 2
4 3
5 4
6 5
7 5

我想找到带索引的最大3值,所以我的预期结果是:

  distance    
6 5
7 5
2 4
5 4
4 3

我该怎么做?由于我只有一列,是否也可以使用列表而不是数据框?

7 个答案:

答案 0 :(得分:6)

我们可以将sortindex.return=TRUE一起使用,以list的形式返回索引值。然后我们可以根据'x'中的前3个唯一元素对list进行子集。

lst <- sort(df1$distance, index.return=TRUE, decreasing=TRUE)
lapply(lst, `[`, lst$x %in% head(unique(lst$x),3))
#$x
#[1] 5 5 4 4 3

#$ix
#[1] 6 7 2 5 4

答案 1 :(得分:2)

我之前代码的一个小笨拙版本:

 df[order(df$distance, decreasing = TRUE)[sort(unique(df$distance))], , drop = FALSE]
  distance
6        5
7        5
2        4
5        4
4        3

答案 2 :(得分:1)

df[order(df, decreasing=TRUE)[1:3],,drop=FALSE]

如果您有更多列,那么您应该

 df[order(df$column_name, decreasing=TRUE)[1:3],,drop=FALSE]

答案 3 :(得分:1)

如果您要查找一列从升序到降序的列

rownames = rownames(df)
indexes <- order(df$ColumnName,decreasing = TRUE)[1:N]

result <- NULL
for (i in indexes)
  result<- c(rownames[i],result)

result

在这里,我们将行名保存在“结果”向量中。这也将返回索引。

答案 4 :(得分:1)

使用libaray data.table是一种更快的解决方案,因为setorderordersort快:

library(data.table)

select_top_n<-function(scores,n_top){
    d <- data.frame(
        x   = copy(scores),
        indice=seq(1,length(scores)))
    
    setDT(d)
    setorder(d,-x)
    n_top_indice<-d$indice[1:n_top]
    return(n_top_indice)
}


select_top_n2<-function(scores,n_top){
    
    n_top_indice<-order(-scores)[1:n_top]
    return(n_top_indice)
}

select_top_n3<-function(scores,n_top){
    
    n_top_indice<-sort(s, index.return=TRUE, decreasing=TRUE)$ix[1:n_top]
    return(n_top_indice)
}

测试:

set.seed(123)
s=runif(100000)

library(microbenchmark)
mbm<-microbenchmark(
    ind1 = select_top_n(s,100),
    ind2=select_top_n2(s,100),
    ind3=select_top_n3(s,100),
    times = 10L
)

输出:

Unit: milliseconds
 expr       min       lq      mean    median        uq       max neval
 ind1  5.824576  5.98959  6.209746  6.052658  6.270312  7.422736    10
 ind2  9.627950 10.08661 10.274867 10.377451 10.560912 10.588223    10
 ind3 10.397383 11.32129 12.087122 12.498817 12.856840 13.155845    10

请参阅Getting the top values by group

答案 5 :(得分:1)

您可以使用软件包nth中的函数Rfast获取索引或值

> x=runif(100000)
> num.of.nths <- 3
> Rfast2::benchmark(a<-Rfast::nth(x,3,num.of.nths,TRUE,TRUE),b<-order(x,decreasing = T)[1:3],times = 10)
   milliseconds 
                                        min     mean     max
a <- Rfast::nth(x, 3, 3, TRUE, TRUE) 1.6483  2.12419  3.1238
b <- order(x, decreasing = T)[1:3]   6.8648 12.31633 27.1988
> 
> a
      [,1]
[1,]  8058
[2,] 63946
[3,] 17556
> b
[1]  8058 63946 17556

答案 6 :(得分:0)

获取任何列的最高百分比(比例)

df <- df %>% slice_max(IndexCol, prop = .25)

或一组

df <- df %>% group_by(col1, col2) %>% slice_max(IndexCol, prop = .25)

https://dplyr.tidyverse.org/reference/slice.html