2016-07-22 4 views
1

Когда я выполняю следующий запрос по набору данных mtcars, я получаю ниже результатов.Dplyr: суммировать, мутировать и ранжировать в группе

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 

В настоящее время в каждой группе (ранги), я хочу к югу рангу наблюдения, основанное на totalwt, поэтому конечный результат должен выглядеть (по убыванию порядка totalwt в каждом ранге группы)

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 

Тогда, наконец, топ 1, где каждый ранг, где к югу ранг = 1, так что результат будет:

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 

ответ

3

Если «mtcars1» выводится из кода OP, мы можем использовать rank для создать «Подранг» после того, как группировка по «рангу»

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 

Затем мы filter строки, где «Подранг» является 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

спасибо, это работает –

Смежные вопросы