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包)
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)
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)
如果要在数据中包括月份数的零计数,可以使用一些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)
对于我的聚合,我通常最终想要看到平均值和“这个组有多大”(又名长度)。所以这是我在这些场合的方便片段;
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)
使用包的sql解决sqldf
方案:
library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
FROM df1
GROUP BY Year, Month")
Run Code Online (Sandbox Code Playgroud)
使用collapse
包中R
library(collapse)
library(magrittr)
df %>%
fgroup_by(year, month) %>%
fsummarise(number = fNobs(x))
Run Code Online (Sandbox Code Playgroud)