统计每个组内的行数

我有一个数据框,我想统计每个组内的行数。 我正常使用aggregate函数来aggregate数据如下:

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

现在,我想统计观察,但似乎无法find合适的论据。 直觉上,我认为这将如下:

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

还有df2 <- count(x, c('Year','Month')) (plyr包)

遵循@ Joshua的build议,这里有一种方法可以计算出你的df数据框中Year = 2007和Month = Nov(假设它们是列)的观测值的数量:

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

并与aggregate ,遵循@GregSnow:

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

我们也可以使用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) 

我们也可以使用pipe道和n()函数稍微长一点的版本:

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

或“计数function”

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

没有data.table解决scheme的老问题。 所以这里…

使用.N

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

用于aggregate的简单选项是length函数,它将给出子集中vector的长度。 有时更强健的是使用function(x) sum( !is.na(x) )

为每一行创build一个值为1的新variablesCount

 df1["Count"] <-1 

然后聚合dataframe,按Count列进行求和:

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

在这种情况下, aggregate()函数的一个替代方法是使用as.data.frame() table() as.data.frame() ,它也会指示Year和Month的哪些组合与零次出现相关联

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

对于我的聚合,我通常最终希望看到的意思是“这个组合有多大”(又称长度)。 所以这是我在那些场合的方便片段。

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