我有一个只有一列的数据框,我想用它的索引找到最大的三个值。例如,我的数据框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
我该怎么做?由于我只有一列,是否也可以使用列表而不是数据框?
答案 0 :(得分:6)
我们可以将sort
与index.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
是一种更快的解决方案,因为setorder
比order
和sort
快:
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
答案 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)