2017-10-08 38 views
0

我有一個數據框,如下所示。它只是一個例子。真實的數據集要大得多。根據同一數據框中不同列的最大值/最小排序值對數據幀中的列進行篩選

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得到任何結果。任何形式的幫助都會非常有用。在此先感謝

回答

0

一種選擇是在summarise()改變變量的名稱,然後inner_join()dfworst

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

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

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

2

這是一個更簡短的解決方案,無需創建單獨的數據框。只需使用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

非常感謝你的幫助 –

相關問題