2016-07-22 16 views
1

Wenn ich folgenden Abfrage auf mtcars Datensatz ausführen, bekomme ich unten Ergebnisse.Dplyr: Zusammenfassen, mutieren und Rang innerhalb der Gruppe

mtcars %>% 
    group_by(cyl,gear) %>% 
    summarise(total_cnt = n(), totalwt = sum(wt)) %>% 
    arrange(cyl, gear, desc(total_cnt), desc(totalwt)) %>% 
    mutate(rank = dense_rank(desc(total_cnt))) %>% 
    arrange(rank) 

cyl gear total totalwt rank 
    <dbl> <dbl> <int> <dbl> <int> 
1  4  4  8 19.025  1 
2  6  4  4 12.375  1 
3  8  3 12 49.249  1 
4  4  5  2 3.653  2 
5  6  3  2 6.675  2 
6  8  5  2 6.740  2 
7  4  3  1 2.465  3 
8  6  5  1 2.770  3 

nun innerhalb jeder Gruppe (von Reihen), möchte ich Unter Rang, um die Basis Beobachtungen auf totalwt, so sollte die endgültige Ausgabe aussehen (ab Reihenfolge der totalwt innerhalb jeder Rank-Gruppe)

cyl gear total_cnt totalwt rank subrank 
    <dbl> <dbl>  <int> <dbl> <int> <int> 
1  4  4   8 19.025  1 2 
2  6  4   4 12.375  1 3 
3  8  3  12 49.249  1 1 
4  4  5   2 3.653  2 3 
5  6  3   2 6.675  2 2 
6  8  5   2 6.740  2 1 
7  4  3   1 2.465  3 2 
8  6  5   1 2.770  3 1 

dann endlich 1 oben, wobei jeder Rang, wo Unterrang = 1, so ausgegeben werden würde:

cyl gear total_cnt totalwt rank subrank 
    <dbl> <dbl>  <int> <dbl> <int> <int> 
3  8  3  12 49.249  1 1 
6  8  5   2 6.740  2 1 
8  6  5   1 2.770  3 1 

Antwort

3

Wenn ‚mtcars1‘ wird von dem Code des OP können wir rank verwenden, um schaffen die 'subrank' nach dem Gruppieren von 'Rang'

mtcars2 <- mtcars1 %>% 
       group_by(rank) %>% 
       mutate(subrank = rank(-totalwt)) 
mtcars2 
# cyl gear total_cnt totalwt rank subrank 
# <dbl> <dbl>  <int> <dbl> <int> <dbl> 
#1  4  4   8 19.025  1  2 
#2  6  4   4 12.375  1  3 
#3  8  3  12 49.249  1  1 
#4  4  5   2 3.653  2  3 
#5  6  3   2 6.675  2  2 
#6  8  5   2 6.740  2  1 
#7  4  3   1 2.465  3  2 
#8  6  5   1 2.770  3  1 

Dann filter wir die Zeilen, in denen 'subrank' 1

mtcars2 %>% 
     filter(subrank ==1) 
# cyl gear total_cnt totalwt rank subrank 
# <dbl> <dbl>  <int> <dbl> <int> <dbl> 
#1  8  3  12 49.249  1  1 
#2  8  5   2 6.740  2  1 
#3  6  5   1 2.770  3  1 
+1

vielen Dank, es funktioniert –

Verwandte Themen