计算每个组中的行数

Mik*_*eTP 102 aggregate r dataframe r-faq

我有一个数据帧,我想计算每组内的行数.我通常使用该aggregate函数对数据求和如下:

df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Run Code Online (Sandbox Code Playgroud)

现在,我想计算观察结果,但似乎无法找到适当的论据FUN.直觉上,我认为它会如下:

df2 <- aggregate(x ~ Year + Month, data = df1, count)
Run Code Online (Sandbox Code Playgroud)

但是,没有这样的运气.

有任何想法吗?


一些玩具数据:

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))
Run Code Online (Sandbox Code Playgroud)

Ben*_*Ben 58

按照@Joshua的建议,这里有一种方法可以计算df数据框中Year= 2007和Month= 11月(假设它们是列)的观察数量:

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])
Run Code Online (Sandbox Code Playgroud)

aggregate@GregSnow一起:

aggregate(x ~ Year + Month, data = df, FUN = length)
Run Code Online (Sandbox Code Playgroud)


geo*_*ory 55

还有__CODE__(plyr包)

  • 我不知道,但这也很有用......`df%>%group_by(group,variable)%>%mutate(count = n())` (5认同)
  • 我是 dplyr 的日常用户,但仍然不认为它一定是最佳实践,更像是常见的个人偏好 (4认同)
  • 我会`cbind``aggregate(Sepal.Length ~ Species, iris, mean)`和`aggregate(Sepal.Length ~ Species, iris, length)`的结果 (2认同)
  • 是的 dplyr 现在是最佳实践。 (2认同)

jer*_*ycg 39

我们也可以使用dplyr.

首先,一些数据:

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

伯爵:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)
Run Code Online (Sandbox Code Playgroud)

我们还可以使用稍长版本的管道和count功能:

df %>% 
  group_by(year, month) %>%
  summarise(number = n())
Run Code Online (Sandbox Code Playgroud)

tally功能:

df %>% 
  group_by(year, month) %>%
  tally()
Run Code Online (Sandbox Code Playgroud)


mne*_*nel 35

一个没有data.table解决方案的老问题.所以这里......

运用 .N

library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
Run Code Online (Sandbox Code Playgroud)

  • 现在标准使用 `.()` 而不是 `list()` 和 `setDT()` 将 data.frame 转换为 data.table。因此一步“setDT(df)[, .N, by = .(year, Month)]”。 (2认同)

Gre*_*now 22

使用的简单选项aggregatelength函数,它将为您提供子集中向量的长度.有时使用会更加健壮function(x) sum( !is.na(x) ).


Ben*_*nes 16

aggregate()在这种情况下,函数的替代方案是table()with 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")]))
Run Code Online (Sandbox Code Playgroud)

并且没有零发生的组合

myAns[which(myAns$Freq>0),]
Run Code Online (Sandbox Code Playgroud)


Ler*_*one 16

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

df1["Count"] <-1
Run Code Online (Sandbox Code Playgroud)

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

df2 <- aggregate(df1[c("Count")], by=list(Year=df1$Year, Month=df1$Month), FUN=sum, na.rm=TRUE)
Run Code Online (Sandbox Code Playgroud)


lmo*_*lmo 7

如果要在数据中包括月份数的零计数,可以使用一些table魔术。

data.frame(with(df1, table(Year, Month)))
Run Code Online (Sandbox Code Playgroud)

例如,问题df1中的toy data.frame不包含2014年1月的观测值。

df1
    x Year Month
1   1 2012   Feb
2   2 2014   Feb
3   3 2013   Mar
4   4 2012   Jan
5   5 2014   Feb
6   6 2014   Feb
7   7 2012   Jan
8   8 2014   Feb
9   9 2013   Mar
10 10 2013   Jan
11 11 2013   Jan
12 12 2012   Jan
13 13 2014   Mar
14 14 2012   Mar
15 15 2013   Feb
16 16 2014   Feb
17 17 2014   Mar
18 18 2012   Jan
19 19 2013   Mar
20 20 2012   Jan
Run Code Online (Sandbox Code Playgroud)

基本R aggregate函数不会返回2014年1月的观测值。

aggregate(x ~ Year + Month, data = df1, FUN = length)
  Year Month x
1 2012   Feb 1
2 2013   Feb 1
3 2014   Feb 5
4 2012   Jan 5
5 2013   Jan 2
6 2012   Mar 1
7 2013   Mar 3
8 2014   Mar 2
Run Code Online (Sandbox Code Playgroud)

如果您希望用0作为计数来观察这个月年,那么上面的代码将返回一个data.frame,其中包含所有月年组合的计数:

data.frame(with(df1, table(Year, Month)))
  Year Month Freq
1 2012   Feb    1
2 2013   Feb    1
3 2014   Feb    5
4 2012   Jan    5
5 2013   Jan    2
6 2014   Jan    0
7 2012   Mar    1
8 2013   Mar    3
9 2014   Mar    2
Run Code Online (Sandbox Code Playgroud)

  • 你为什么删除这个?这是一个很好的答案。 (4认同)

maz*_*aze 5

对于我的聚合,我通常最终想要看到平均值和“这个组有多大”(又名长度)。所以这是我在这些场合的方便片段;

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)
Run Code Online (Sandbox Code Playgroud)


M--*_*M-- 5

使用包的解决sqldf方案:

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

使用collapse包中R

library(collapse)
library(magrittr)
df %>% 
    fgroup_by(year, month) %>%
    fsummarise(number = fNobs(x))
Run Code Online (Sandbox Code Playgroud)