我有一个数据框,我想计算每个组中的行数。我定期使用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))
答案 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
包的sql解决方案:
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))