计算每个组中的行数

时间:2012-03-21 16:50:33

标签: r dataframe r-faq

我有一个数据框,我想计算每个组中的行数。我定期使用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))

15 个答案:

答案 0 :(得分:53)

根据@Joshua的建议,您可以通过以下方式计算df数据框中Year = 2007和Month = 11月(假设它们是列)的观察数量:< / p>

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

aggregate,跟随@GregSnow:

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

答案 1 :(得分:46)

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

答案 2 :(得分:34)

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

答案 3 :(得分:31)

没有data.table解决方案的旧问题。所以这里......

使用.N

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

答案 4 :(得分:21)

aggregate一起使用的简单选项是length函数,它将为您提供子集中矢量的长度。有时候使用function(x) sum( !is.na(x) )会更加健壮。

答案 5 :(得分:16)

在这种情况下,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),]

答案 6 :(得分:16)

为每行创建一个值为1的新变量Count

df1["Count"] <-1

然后汇总数据框,按Count列汇总:

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

答案 7 :(得分:4)

对于我的汇总,我通常最终想要看到意思和&#34;这个群体有多大&#34; (a.k.a.长度)。 所以这是我在这些场合的便利片段;

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)

答案 8 :(得分:2)

使用sqldf包的解决方案:

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

答案 9 :(得分:0)

考虑到@Ben答案,如果df1不包含x列,则R会抛出错误。但是paste可以优雅地解决它:

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

同样,如果在分组中使用两个以上的变量,则可以推广:

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

答案 10 :(得分:0)

您可以将by函数用作by(df1$Year, df1$Month, count),这将产生所需聚合的列表。

输出看起来像

df1$Month: Feb
     x freq
1 2012    1
2 2013    1
3 2014    5
--------------------------------------------------------------- 
df1$Month: Jan
     x freq
1 2012    5
2 2013    2
--------------------------------------------------------------- 
df1$Month: Mar
     x freq
1 2012    1
2 2013    3
3 2014    2
> 

答案 11 :(得分:0)

这里已经有很多不错的答案,但是对于那些想要向原始数据集添加新列(包含重复行的次数)的人,我想再添加一个选项。

df1$counts <- sapply(X = paste(df1$Year, df1$Month), 
                     FUN = function(x) { sum(paste(df1$Year, df1$Month) == x) })

可以通过将以上任何答案与merge()函数组合来实现相同目的。

答案 12 :(得分:0)

如果您尝试上面的汇总解决方案,但出现错误:

变量的无效类型(列表)

因为您使用的是日期或日期时间戳记,请尝试在变量上使用as.character:

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

在一个或两个变量上。

答案 13 :(得分:0)

library(tidyverse)

df_1 %>%
  group_by(Year, Month) %>%
  summarise(count= n()) 

答案 14 :(得分:0)

collapse 中使用 R

library(collapse)
library(magrittr)
df %>% 
    fgroup_by(year, month) %>%
    fsummarise(number = fNobs(x))