汇总/汇总每个组的多个variables(即总和,平均值等)
从数据框架,有一个简单的方法来同时聚合(即总结)多个variables吗?
以下是一些示例数据:
library(lubridate) days = 365*2 date = seq(as.Date("2000-01-01"), length = days, by = "day") year = year(date) month = month(date) x1 = cumsum(rnorm(days, 0.05)) x2 = cumsum(rnorm(days, 0.05)) df1 = data.frame(date, year, month, x1, x2)
我想同时按年份和月份从df2
dataframe中汇总x1
和x2
variables。 以下代码聚合了x1
variables,但是是否也可以同时聚合x2
variables?
### aggregate variables by year month df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE) head(df2)
任何build议将不胜感激。
今年()函数从哪里来?
你也可以使用reshape2包来完成这个任务:
require(reshape2) df_melt <- melt(df1, id = c("date", "year", "month")) dcast(df_melt, year + month ~ variable, sum) # year month x1 x2 1 2000 1 -80.83405 -224.9540159 2 2000 2 -223.76331 -288.2418017 3 2000 3 -188.83930 -481.5601913 4 2000 4 -197.47797 -473.7137420 5 2000 5 -259.07928 -372.4563522
是的,在你的formula
,你可以cbind
数值variables进行聚合:
aggregate(cbind(x1, x2) ~ year + month, data = df1, sum, na.rm = TRUE) year month x1 x2 1 2000 1 7.862002 -7.469298 2 2001 1 276.758209 474.384252 3 2000 2 13.122369 -128.122613 ... 23 2000 12 63.436507 449.794454 24 2001 12 999.472226 922.726589
请参阅?aggregate
, formula
参数和示例。
使用快速的data.table
包(适用于较大的数据集)
https://github.com/Rdatatable/data.table/wiki
library(data.table) df2 <- setDT(df1)[, lapply(.SD, sum), by=.(year, month), .SDcols=c("x1","x2")] setDF(df2) # convert back to dataframe
使用plyr包
require(plyr) df2 <- ddply(df1, c("year", "month"), function(x) colSums(x[c("x1", "x2")]))
使用Hmisc包中的summarize()(列标题在我的例子中是凌乱的)
# need to detach plyr because plyr and Hmisc both have a summarize() detach(package:plyr) require(Hmisc) df2 <- with(df1, summarize( cbind(x1, x2), by=llist(year, month), FUN=colSums))
使用dplyr
软件包,您可以使用dplyr
函数同时聚合多个variables。 对于示例数据集,您可以这样做,如下所示:
library(dplyr) # option 1 df2 <- df1 %>% group_by(year, month) %>% summarise_each(funs(sum), -date) # option 2 df2 <- df1 %>% group_by(year, month) %>% summarise_each(funs(sum), x1, x2)
在summarise_each
函数中,您可以指示不包含哪个variables( 选项1 )或包含( 选项2 )。 如果不在summarise_each函数中指定variables,则会汇总所有其他variables(除了goupingvariables)。
最近, *_at
和*_all
函数已被添加到dplyr
,也可以使用它:
df2 <- df1 %>% group_by(year, month) %>% summarise_at(vars(x1, x2), sum)
所有的结果都一样:
year month x1 x2 <dbl> <dbl> <dbl> <dbl> 1 2000 1 -73.58134 -92.78595 2 2000 2 -57.81334 -152.36983 3 2000 3 122.68758 153.55243 4 2000 4 450.24980 285.56374 5 2000 5 678.37867 384.42888 6 2000 6 792.68696 530.28694 7 2000 7 908.58795 452.31222 8 2000 8 710.69928 719.35225 9 2000 9 725.06079 914.93687 10 2000 10 770.60304 863.39337 # ... with 14 more rows
注意: summarise_each
在不久的将来将被弃用,以支持summarise_all
, summarise_at
和summarise_if
。
正如我在上面的评论中提到的 ,你也可以使用reshape2
的recast
function:
library(reshape2) recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month"))
这会给你相同的结果。