我有一个数据集,其中包含每个州的多个城市的值。我想在每个州获得第三个(例如)最低值,并返回城市名称。
我可以通过以下方式获得每个州的最低价值:
tapply(df2[,11],df2$State, min )
但是如何获得第n个最低(并且还返回城市名称)?
数据位于第11列,状态位于第7列(标题为" State"),城市名称位于第2列。
答案 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)
跟踪变量中的最低,第二低和第三低。每当你看到一个新的最低值时,将前一个最低值放在第二个最低变量中,并将当前第二个最低值放在第三个最低变量中。