2012-03-21 5 views
66

У меня есть dataframe, и я хотел бы подсчитать количество строк в каждой группе. Я reguarly использовать функцию aggregate суммировать данные следующим образом:Подсчитайте количество строк в каждой группе

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

Теперь я хотел бы рассчитывать наблюдения, но не могу показаться, чтобы найти правильный аргумент для FUN. Интуитивно я думал, что это будет следующим:

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

Но, нет такой удачи.

Любые идеи?


Некоторые игрушки данные:

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

Я продолжаю читать этот вопрос, задавая интересный способ подсчета вещей (в отличие от многих u nfun пути, я думаю). –

+2

@JoshuaUlrich: 'nrow' не работал для меня, но' NROW' и 'length' работал отлично. +1 – Prolix

ответ

35

Существует также df2 <- count(x, c('Year','Month')) (plyr пакет)

+0

Есть ли способ агрегировать переменную и делать подсчет тоже (например, 2 функции в агрегировании: среднее + количество)? Мне нужно получить среднее значение столбца и количество строк для одного и того же значения в другом столбце. – sop

+0

Я бы «cbind» результаты «aggregate (Sepal.Length ~ Species, iris, mean)» и «aggregate» (Sepal .Length ~ Виды, диафрагма, длина) ' – geotheory

+0

Я сделал это, но кажется, что я получаю 2 раза каждый столбец, кроме агрегированного; поэтому я сделал слияние на них, и кажется, что это нормально – sop

46

После @ предложение Джошуа, вот один из способов вы можете подсчитать количество наблюдений в вашем df dataframe где Year = 2007 и Month = ноябрь (при условии, что они являются столбцами):

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

и aggregate после @GregSnow:

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

Простой вариант для использования с aggregate является length функция, которая даст вам длину вектора в подмножестве. Иногда немного более надежным является использование function(x) sum(!is.na(x)).

14

В качестве альтернативы функции aggregate() в этом случае будет table() с as.data.frame(), которые также указывают, какие комбинации год и месяц связаны с нулем вхождений

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

А без нулевой встречающихся комбинаций

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

Создать новую переменную Count со значением 1 для каждой строки:

df1["Count"] <-1 

Тогда совокупный dataframe, суммируя по Count колонке:

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

старый вопрос без data.table раствора. Так здесь идет ...

Использования .N

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

Для моих агрегатов я обычно в конечном итоге хочу видеть в виду и «насколько велика эта группа» (а.к.а. длина). Итак, это мой удобный фрагмент для этих случаев;

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

Мы также можем использовать dplyr.

Во-первых, некоторые данные:

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

Теперь отсчет:

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

Мы также можем использовать немного длиннее версию с трубопроводами и функцию n():

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

или функция «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

Учитывая @Ben ответа, R будет выдавать ошибку, если df1 не содержит x столбца. Но она может быть решена элегантно с paste:

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

Аналогично, можно обобщить, если более чем две переменные используются в группировке:

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW) 
Смежные вопросы