Załóżmy, że chcę obliczyć proporcje różnych wartości w każdej grupie. Na przykład, przy użyciu mtcars
danych, jak mogę obliczyć względną częstotliwość liczby biegów przez rano (automatyczny / manualny) w jednej porcji z dplyr
?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
Co chciałbym osiągnąć:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
prop.table()
/sweep()
. Również w innych pytaniach niektórzy ludzie proszą o opcję uwzględnienia zliczeń zerowych dla zmiennych lub interakcji zmiennychOdpowiedzi:
Spróbuj tego:
Z winiety dplyr :
W ten sposób po
summarise
ostatniej zmiennej grupującej podanej wgroup_by
„gear” jest usuwana. Na tymmutate
etapie dane są grupowane według pozostałych zmiennych grupujących, tutaj „am”. Możesz sprawdzić grupowanie w każdym kroku za pomocągroups
.Wynik peelingu jest oczywiście zależny od kolejności zmiennych grupujących w
group_by
wywołaniu. Możesz chcieć zrobić następnągroup_by(am)
, aby uczynić swój kod bardziej przejrzystym.Aby uzyskać informacje o zaokrąglaniu i upiększaniu, zapoznaj się z miłą odpowiedzią @Tyler Rinker.
źródło
sum(n)
nadam
grupą, a nie nadgear
grupą ...summarise
, powie, które grupy zostały. Och, dplyr rządzi ...Możesz użyć
count()
funkcji, która zachowuje się jednak inaczej w zależności od wersjidplyr
:dplyr 0.7.1: zwraca niezgrupowaną tabelę: musisz ponownie pogrupować według
am
dplyr <0.7.1: zwraca zgrupowaną tabelę, więc nie ma potrzeby ponownego grupowania, chociaż możesz chcieć to zrobić
ungroup()
dla późniejszych manipulacjidplyr 0.7.1
dplyr <0.7.1
Powoduje to utworzenie zgrupowanej tabeli , jeśli chcesz jej użyć do dalszej analizy, może być przydatne usunięcie zgrupowanego atrybutu za pomocą
ungroup()
.źródło
dplyr
0.7.1. Oblicza częstotliwość ogólnie na „biegu” zamiast na każdym poziomie „am”.@ Henrik jest lepszy pod względem użyteczności, ponieważ sprawi, że kolumna będzie znakowa i nie będzie już numeryczna, ale będzie pasować do tego, o co prosiłeś ...
EDYTUJ Ponieważ Spacedman poprosił o to :-)
źródło
format
metody, która dodaje znak procentu ... #overkillOto ogólna funkcja implementująca rozwiązanie Henrika w wersji
dplyr
0.7.1.źródło
Error in bind_rows_(x, .id) : Column
am` nie może zostać przekonwertowane z liczbowego naNapisałem małą funkcję dla tego powtarzającego się zadania:
Mogę wtedy używać go tak:
Zwraca:
źródło
Pomimo wielu odpowiedzi, jeszcze jedno podejście, które wykorzystuje
prop.table
w połączeniu zdplyr
lubdata.table
.źródło
Ta odpowiedź jest oparta na odpowiedzi Matifou.
Najpierw zmodyfikowałem go, aby upewnić się, że kolumna freq nie zostanie zwrócona jako kolumna notacji naukowej, używając opcji scipen.
Następnie mnożę odpowiedź przez 100, aby uzyskać procent, a nie liczbę dziesiętną, aby ułatwić odczytanie kolumny freq jako wartości procentowej.
źródło