Pytanie Policz liczbę wierszy w każdej grupie


Mam ramkę danych i chciałbym policzyć liczbę wierszy w każdej grupie. Regularnie korzystam z aggregate funkcja do sumowania danych w następujący sposób:

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

Teraz chciałbym policzyć obserwacje, ale nie wydaje się, aby znaleźć odpowiedni argument FUN. Intuicyjnie pomyślałem, że będzie to wyglądało następująco:

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

Ale nie ma 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))

76
2018-03-21 16:50


pochodzenie


nrow, NROW, length... - Joshua Ulrich
Wciąż czytam to pytanie, prosząc o zabawny sposób zliczania rzeczy (w przeciwieństwie do wielu nieudanych sposobów, jak sądzę). - Hong Ooi
@JoshuaUlrich: nrow nie działa dla mnie, ale NROW i lengthdziałało dobrze. +1 - Prolix


Odpowiedzi:


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


37
2018-06-05 13:48



Czy istnieje sposób agregowania zmiennej i także jej liczenia (jak 2 funkcje w agregacji: średnia + liczba)? Potrzebuję uzyskać średnią z kolumny i liczbę wierszy dla tej samej wartości w innej kolumnie - sop
ID cbind wyniki aggregate(Sepal.Length ~ Species, iris, mean) i aggregate(Sepal.Length ~ Species, iris, length) - geotheory
Zrobiłem to, ale wydaje mi się, że dostaję 2 razy każdą kolumnę oprócz tej, która jest agregowana; więc zrobiłem scalenie i wydaje mi się, że jest w porządku - sop
Nie wiem, ale może to być również przydatne ... df %>% group_by(group, variable) %>% mutate(count = n()) - Manoj Kumar
Tak dplyr jest teraz najlepszą praktyką. - geotheory


Po sugestii @ Joshua, oto jeden ze sposobów, aby policzyć liczbę obserwacji w swoim df ramka danych gdzie Year = 2007 i Month = Nov (zakładając, że są to kolumny):

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

i z aggregate, po @GregSnow:

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

51
2018-03-21 17:06





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 liczba:

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

Możemy również użyć nieco dłuższej wersji z orurowaniem i n() funkcjonować:

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

lub `funkcja tally:

df %>% 
  group_by(year, month) %>%
  tally()

27
2017-08-12 21:55





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

Za pomocą .N 

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

25
2017-08-02 00:30





Prosta opcja do użycia z aggregate jest length funkcja, która da ci długość wektora w podzbiorze. Czasem można użyć trochę mocniej function(x) sum( !is.na(x) ).


20
2018-03-21 18:08





Utwórz nową zmienną Count o wartości 1 dla każdego rzędu:

df1["Count"] <-1

Następnie agreguj ramkę danych, sumując ją przez Count kolumna:

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

16
2017-08-02 00:16





Alternatywa dla aggregate() funkcja w tym przypadku byłaby table() z as.data.frame(), co również wskazuje, które kombinacje roku i miesiąca są powiązane z zerowymi wystąpieniami

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")]))

Bez zerowych kombinacji

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

14
2018-03-21 20:41





Dla moich agregacji zwykle kończę na chęci zobaczenia średniej i "jak duża jest ta grupa" (a.k.a. length). Oto 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)

3
2018-01-05 16:38





ZA  rozwiązanie za pomocą sqldf pakiet:

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")

1
2018-05-29 19:22





Biorąc pod uwagę odpowiedź @Ben, R wyświetliłby błąd, jeśli df1 nie zawiera x kolumna. Ale można go elegancko rozwiązać za pomocą paste:

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

Podobnie można go uogólnić, jeśli w grupowaniu wykorzystywane są więcej niż dwie zmienne:

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

0
2018-02-22 22:55