Mam ramkę danych i chciałbym policzyć wiersze w każdej grupie. Regularnie używam aggregate
funkcji do sumowania danych w następujący sposób:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Chciałbym teraz policzyć obserwacje, ale nie mogę znaleźć odpowiedniego argumentu za FUN
. Intuicyjnie pomyślałem, że będzie tak:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Ale nie ma takiego szczęścia.
Jakieś pomysły?
Niektóre dane dotyczące zabawek:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
nrow
,NROW
,length
...nrow
nie działa dla mnie, aleNROW
ilength
działa dobrze. +1Odpowiedzi:
Aktualna najlepsza praktyka (tidyverse) to:
źródło
cbind
wynikiaggregate(Sepal.Length ~ Species, iris, mean)
iaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Zgodnie z sugestią @ Joshua, oto jeden ze sposobów obliczenia liczby obserwacji w
df
ramce danych, gdzieYear
= 2007 iMonth
= Lis (zakładając, że są to kolumny):i za pomocą
aggregate
@GregSnow:źródło
dplyr
pakiet robi to za pomocącount
/tally
commands lubn()
funkcji :Najpierw trochę danych:
Teraz liczyć:
Możemy też zastosować nieco dłuższą wersję z lamówką i
n()
funkcją:lub
tally
funkcja:źródło
Stare pytanie bez
data.table
rozwiązania. Więc oto idzie ...Za pomocą
.N
źródło
.()
zamiastlist()
isetDT()
do konwersji data.frame do data.table. Więc w jednym krokusetDT(df)[, .N, by = .(year, month)]
.Prostą opcją do użycia z
aggregate
jestlength
funkcja, która poda długość wektora w podzbiorze. Czasami użycie jest trochę bardziej niezawodnefunction(x) sum( !is.na(x) )
.źródło
Utwórz nową zmienną
Count
o wartości 1 dla każdego wiersza:Następnie zagreguj ramkę danych, sumując według
Count
kolumny:źródło
aggregate
, nie ma potrzeby zmiany nazwy każdej zmiennej wby=
likelist(year=df1$year)
itp. Adata.frame
jestlist
już tak, żeaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
będzie działać.Alternatywą dla
aggregate()
funkcji w tym przypadku byłabytable()
zas.data.frame()
, która wskazywałaby również, które kombinacje roku i miesiąca są powiązane z zerową liczbą wystąpieńI bez kombinacji występujących zero
źródło
Jeśli chcesz uwzględnić 0 zliczeń dla miesięcy-lat, których brakuje w danych, możesz użyć trochę
table
magii.Na przykład zabawkowa ramka data.frame w pytaniu, df1, nie zawiera żadnych obserwacji ze stycznia 2014 r.
Podstawowa
aggregate
funkcja R nie zwraca obserwacji ze stycznia 2014 r.Jeśli chcesz obserwować ten miesiąc-rok z 0 jako liczbą, powyższy kod zwróci ramkę data.frame z licznikami dla wszystkich kombinacji miesiąc-rok:
źródło
W przypadku moich agregacji zwykle chcę zobaczyć średnią i „jak duża jest ta grupa” (czyli długość). Więc to jest mój przydatny fragment na te okazje;
źródło
ZA sqlrozwiązanie za pomocą
sqldf
pakietu:źródło
Biorąc pod uwagę odpowiedź @Ben, R wyrzuci błąd, jeśli
df1
nie zawierax
kolumny. Ale można to elegancko rozwiązać za pomocąpaste
:Podobnie można uogólnić, jeśli w grupowaniu są używane więcej niż dwie zmienne:
źródło
Możesz użyć
by
funkcji, ponieważby(df1$Year, df1$Month, count)
utworzą one listę potrzebnych agregacji.Wynik będzie wyglądał następująco:
źródło
Jest tu już wiele wspaniałych odpowiedzi, ale chciałem dodać jeszcze 1 opcję dla tych, którzy chcą dodać nową kolumnę do oryginalnego zbioru danych, która zawiera liczbę powtórzeń tego wiersza.
To samo można osiągnąć, łącząc dowolną z powyższych odpowiedzi z
merge()
funkcją.źródło
Jeśli wypróbowujesz powyższe rozwiązania zagregowane i pojawi się błąd:
nieprawidłowy typ (lista) dla zmiennej
Ponieważ używasz znaczników daty lub daty i godziny, spróbuj użyć as.character w zmiennych:
Na jednej lub obu zmiennych.
źródło