根据同一数据框中不同列的最大值/最小排序值对数据帧中的列进行筛选

问题描述:

我有一个数据框,如下所示。它只是一个例子。真实的数据集要大得多。根据同一数据框中不同列的最大值/最小排序值对数据帧中的列进行筛选

Hospital State Mortality Rank 
aaa   AK  9.7  1 
bbb   AK  10.5  2 
ccc   AK  11.3  3 
ddd   AK  11.5  4 
eee   AL   8.7  1 
ggg   AL   9.1  2 
hhh   AL   9.3  3 
mmm   AR   9.9  1 
nnn   AR   10.2  2 
ooo   AR   10.4  3 
ppp   AZ   7.5  1 
qqq   AZ   8.7  2 

为了可重复使用的目的获取上述数据帧的代码如下。

df <- data.frame(Hospital=c("aaa","bbb","ccc","ddd","eee","ggg","hhh","mmm","nnn","ooo","ppp","qqq"),State=c("AK","AK","AK","AK","AL","AL","AL","AR","AR","AR","AZ","AZ"), Mortality=c(9.7,10.5,11.3,11.5,8.7,9.1,9.3,9.9,10.2,10.4,7.5,8.7),Rank=c(1,2,3,4,1,2,3,1,2,3,1,2))

当我通过所谓最坏的说法,我想从具有最低排名数据帧抽取医院和状态栏。

预期的输出应该是这样的

Hospital State 

ddd   AK  
hhh   AL   
ooo   AR  
qqq   AZ  

即使我能得到如下结果一个,我可以使用dplyer的选择功能,并得到上述预期的结果。

Hospital State Mortality Rank 

ddd   AK  11.5  4 
hhh   AL   9.3  3 
ooo   AR   10.4  3 
qqq   AZ   8.7  2 

我利用下面的代码来得到每个组中排名最低的值的列表。对象最差1列出了每个组的最低排名值。

worst<-df %>% group_by(State) %>% summarise(max = max(Rank)) 
worst1 <- as.vector(worst[,2, drop=FALSE]) 

想知道如果我可以使用它来提取我的期望输出或是否有更简单的方法,直接获得所需的输出。

我试过使用这个df[df$Rank %in% worst1,]但我dint得到任何结果。任何形式的帮助都会非常有用。在此先感谢

一种选择是在summarise()改变变量的名称,然后inner_join()dfworst

worst <- df %>% 
    group_by(State) %>% 
    summarise(Rank = max(Rank)) 

worst1 <- inner_join(df, worst, by = c("State", "Rank")) 
+0

非常感谢。它的工作就像我想要的 –

这是一个更简短的解决方案,无需创建单独的数据框。只需使用dplyr :: top_n

df %>% group_by(State) %>% top_n(1, Rank) 
+0

感谢@NiclasRudolfson这个不错的技巧,我不知道'top_n'函数。 @ Sai Ram,同样,'df%>%group_by(州)%>%top_n(-1,Rank)'会给你每个州的最低排名医院。 – ANG

+0

top_n()将选择每个组中排名最高的行,所以会给你“最差”的医院。如果你想得到最好的结果,我会建议'top_n(1,desc(Rank)'而不是'top_n(-1,Rank)' – NiclasRudolfson

+0

非常感谢你的帮助 –