2016-09-15 13 views
6

Chciałbym dodać ogólne podsumowania wierszy, a także obliczać podsumowania według grup za pomocą dplyr. Znalazłem różne pytania z pytaniem, jak to zrobić, np. here, here i here, ale nie ma jasnego rozwiązania. Jednym z możliwych rozwiązań jest wykonywanie count dwukrotnie i wiążą wiersze:dodać sumy wierszy marginesów w łańcuchu DFFF

mtcars %>% 
    count(cyl, gear) %>% 
    bind_rows(
    count(mtcars, gear) 
) 

który prawie produkuje czego potrzebuję (kolumna po lewej większość ma NAS zamiast „całkowita” lub podobny):

 cyl gear  n 
    <dbl> <dbl> <int> 
1  4  3  1 
2  4  4  8 
3  4  5  2 
4  6  3  2 
5  6  4  4 
6  6  5  1 
7  8  3 12 
8  8  5  2 
9  NA  3 15 
10 NA  4 12 
11 NA  5  5 

Czy brakuje mi łatwiejszego/wbudowanego rozwiązania?

+3

można po prostu zrobić 'addmargins (tabela (mtcars $ cyl, mtcars $ bieg))' w bazowej R. – mtoto

Odpowiedz

6

Jedną z opcji jest z do

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl)) %>% 
    do(bind_rows(., data.frame(cyl="Total", count(mtcars, gear)))) 
    #or replace the last 'do' step with 
    #bind_rows(cbind(cyl='Total', count(mtcars, gear))) #from @JonnyPolonsky's comments 

#  cyl gear  n 
# <chr> <dbl> <int> 
#1  4  3  1 
#2  4  4  8 
#3  4  5  2 
#4  6  3  2 
#5  6  4  4 
#6  6  5  1 
#7  8  3 12 
#8  8  5  2 
#9 Total  3 15 
#10 Total  4 12 
#11 Total  5  5 
+1

Dzięki @akrun, że działa bardzo dobrze. Nie jestem pewien, czy konieczne jest wywołanie "wykonaj" - "mtcars%>% licznik (cyl, bieg)%>% rozgrupowanie()%>% mutate (cyl = as.character (cyl))%>% bind_rows (cbind (cyl = 'Total', count (mtcars, gear))) 'działa równie dobrze. Będę czekać, aby sprawdzić, czy ktoś ma wbudowaną odpowiedź 'dplyr' i zaakceptuje w ciągu 24 godzin. Wielkie dzięki –

+1

@ JonnyPolonsky Dzięki, jestem w autobusie, więc nie mogłem używać myszy. Powinno też działać. – akrun

+0

Nie ma potrzeby 'ungroup().' 'Count()' wywołuje 'group_by()' before i 'ungroup()' after. – Nettle

0

Dodatek do użytkownika @ arkrun odpowiedź, że nie jest to łatwe, aby dodać komentarz:

Choć trochę bardziej skomplikowane, format ten pozwala na poprzednich modyfikacji w ramka danych. Przydaje się, gdy istnieje dłuższy łańcuch czasowników przed wygenerowaniem tabeli. (Chcesz zmienić nazwy lub wybrać tylko określone zmienne)

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl)) 
bind_rows(group_by(.,gear) %>% 
       summarise(n=sum(n)) %>% 
       mutate(cyl='Total')) %>% 
spread(cyl) 

## A tibble: 3 x 5 
# gear `4` `6` `8` Total 
#* <dbl> <dbl> <dbl> <dbl> <dbl> 
#1  3  1  2 12 15 
#2  4  8  4  0 12 
#3  5  2  1  2  5 

To również może być podwojona do generowania całkowitą wiersz dla rozprzestrzeniania również.

mtcars %>% 
    count(cyl, gear) %>% 
    ungroup() %>% 
    mutate(cyl=as.character(cyl), 
     gear = as.character(gear)) %>% 
    bind_rows(group_by(.,gear) %>% 
       summarise(n=sum(n)) %>% 
       mutate(cyl='Total')) %>% 
    bind_rows(group_by(.,cyl) %>% 
       summarise(n=sum(n)) %>% 
       mutate(gear='Total')) %>% 
    spread(cyl,n,fill=0) 

# A tibble: 4 x 5 
    gear `4` `6` `8` Total 
* <chr> <dbl> <dbl> <dbl> <dbl> 
1  3  1  2 12 15 
2  4  8  4  0 12 
3  5  2  1  2  5 
4 Total 11  7 14 32 
Powiązane problemy