【问题标题】:filter columns in a dataframe based on max value/ least ranked value of a different column in the same dataframe根据同一数据框中不同列的最大值/最低排名值过滤数据框中的列
【发布时间】:2017-10-08 18:40:18
【问题描述】:

我有一个如下的数据框。它只是一个例子。真实的数据集要大得多。

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 的 select 功能并得到上述预期结果。

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,],但我没有得到任何结果。任何形式的帮助都会非常有用。提前致谢

【问题讨论】:

    标签: r select dataframe dplyr filtering


    【解决方案1】:

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

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

    【讨论】:

    • 感谢@NiclasRudolfson 的这个好技巧,我不知道top_n 函数。 @ Sai Ram,同样,df %&gt;% group_by(State) %&gt;% top_n(-1, Rank) 将为您提供每个州排名最低的医院。
    • top_n() 将选择每组中 Rank 值最高的行,因此会给您“最差”的医院。如果你想要最好的,我会推荐top_n(1, desc(Rank) 而不是top_n(-1, Rank)
    • @SaiRam 如果答案正确且对您的问题有用,请在此处接受其中一个答案。
    【解决方案2】:

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

    worst <- df %>%
      group_by(State) %>%
      summarise(Rank = max(Rank))
    
    worst1 <- inner_join(df, worst, by = c("State", "Rank")) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2021-06-19
      • 1970-01-01
      • 2018-10-18
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多