如何在不排序的情况下找到第n个最低值

时间:2014-05-29 16:33:05

标签: r

我有一个数据集,其中包含每个州的多个城市的值。我想在每个州获得第三个(例如)最低值,并返回城市名称。

我可以通过以下方式获得每个州的最低价值:

tapply(df2[,11],df2$State, min )

但是如何获得第n个最低(并且还返回城市名称)?

数据位于第11列,状态位于第7列(标题为" State"),城市名称位于第2列。

3 个答案:

答案 0 :(得分:1)

试试这个例子:

#Dummy data
df <- data.frame(
  State=paste0("State",sort(rep(1:2,10))),
  City=rep(paste0("city",rep(1:10,2))),
  Value=runif(n=20))

#get rank per State
df$Rank <- ave(df$Value, df$State, FUN = rank)

#subset 3rd lowest per State
df[df$Rank==3,]

修改

正如Arun所指出的,部分排序解决方案,使用data.table包:

library(data.table)
dt <- data.table(df)
dt[dt[, .I[Value == sort(Value, partial=3L)[3L]], by=State]$V1]

答案 1 :(得分:1)

使用@ zx8754创建的虚拟数据,您还可以使用dplyr的{​​{1}}函数:

nth

注意:此方法按组对(整个)数据进行排序,因此如果您确实需要一个没有排序的方法,则不适用(但它会使您获得每个州第三低的值)。

答案 2 :(得分:-2)

跟踪变量中的最低,第二低和第三低。每当你看到一个新的最低值时,将前一个最低值放在第二个最低变量中,并将当前第二个最低值放在第三个最低变量中。