2012-03-21 7 views
66

Mam ramkę danych i chciałbym policzyć liczbę wierszy w każdej grupie. I reguarly użyć funkcji aggregate podsumować dane w następujący sposób:Liczba wierszy w każdej grupie

df2 <- aggregate(x ~ Year + Month, data = df1, sum) 

Teraz chciałbym liczyć obserwacje, ale nie wydaje się znaleźć właściwą argument FUN. Intuicyjnie pomyślałem, że będzie to:

df2 <- aggregate(x ~ Year + Month, data = df1, count) 

Ale nie ma szczęścia.

Wszelkie pomysły?


Niektóre dane zabawki:

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)) 
+14

'nrow',' NROW', 'length'. .. –

+12

Ciągle czytam to pytanie, prosząc o zabawny sposób zliczania rzeczy (w przeciwieństwie do wielu nieudanych sposobów, jak sądzę). –

+2

@JoshuaUlrich: 'nrow' nie działał dla mnie, ale' NROW' i 'length'worked fine. +1 – Prolix

Odpowiedz

35

Istnieje również df2 <- count(x, c('Year','Month')) (pakiet plyr)

+0

Czy istnieje sposób na agregację zmiennej i także jej liczenie (np. 2 funkcje w agregacji: średnia + liczba)? Potrzebuję uzyskać średnią z kolumny i liczbę wierszy dla tej samej wartości w innej kolumnie – sop

+0

Chciałbym "powiązać" wyniki z 'agregatu (Sepal.Length ~ Gatunek, tęczówka, średnia)' i 'zagregować (Sepal .Length ~ Gatunek, tęczówka, długość) ' – geotheory

+0

Zrobiłem to, ale wydaje mi się, że dostaję 2 razy każdą kolumnę oprócz tej, która jest zagregowana; więc zrobiłem scalenie na nich i wydaje mi się, że jest OK – sop

46

Po @ sugestią Jozuego, oto jeden sposób można policzyć liczbę obserwacji w df dataframe gdzie Year = 2007 i Month = listopada (zakładając, że są kolumn)

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"]) 

i aggregate po @GregSnow:

aggregate(x ~ Year + Month, data = df, FUN = length) 
20

Prostym rozwiązaniem, aby skorzystać z aggregate jest funkcja length który daje długość wektora w podgrupie. Czasem trochę bardziej odporne jest użycie function(x) sum(!is.na(x)).

14

Alternatywą do funkcji aggregate() w tym przypadku byłoby table() z as.data.frame(), które również wskazać, które kombinacje rok i miesiąc są związane z zera wystąpień

df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11)) 

myAns<-as.data.frame(table(df[,c("year","month")])) 

i bez kombinacji zerowej występujących

myAns[which(myAns$Freq>0),] 
14

Tworzenie nowej zmiennej Count o wartości 1 dla każdego wiersza:

df1["Count"] <-1 

Łącznej dataframe, zsumowanie przez kolumnę Count:

df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE) 
22

Stary pytanie bez data.table rozwiązanie. Więc tu idzie ...

Korzystanie .N

library(data.table) 
DT <- data.table(df) 
DT[, .N, by = list(year, month)] 
2

dla moich skupisk I zazwyczaj kończy się chcąc zobaczyć myśli i „jak duża jest ta grupa” (długość a.k.a.). To jest mój przydatny fragment na te okazje;

agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean") 
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length") 
aggcount <- agg.count$columnToMean 
agg <- cbind(aggcount, agg.mean) 
25

Możemy również użyć dplyr.

Po pierwsze, niektóre dane:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11)) 

Teraz count:

library(dplyr) 
count(df, year, month) 
#piping 
df %>% count(year, month) 

Możemy również użyć nieco dłuższą wersję z orurowaniem i funkcję n():

df %>% 
    group_by(year, month) %>% 
    summarise(number = n()) 

lub funkcja 'tally':

df %>% 
    group_by(year, month) %>% 
    tally() 
-1
lw<- function(x){length(which(df$variable==someValue))} 

agg<- aggregate(Var1~Var2+Var3, data=df, FUN=lw) 

names(agg)<- c("Some", "Pretty", "Names", "Here") 

View(agg) 
0

Biorąc pod uwagę odpowiedź @Ben, R rzucał błąd, jeśli df1 nie zawiera x kolumnę. Ale to może być rozwiązany elegancko z paste:

aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW) 

Podobnie może być uogólnione, jeśli więcej niż dwie zmienne są wykorzystywane w ugrupowaniu:

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)