我有一个R zoo对象。 zoo对象(z)按日期编制索引,并有多列:
我想以不同的方式聚合每个“列”中的数据(即使用不同的函数),但聚合的行数相同。
我想使用允许我指定要聚合的行数的函数进行聚合。例如:
my_aggregate <- function(data, agg_rowcount) {
# aggregate data over [agg_rowcount] rows....
return (aggregated_data)
}
我最初想过通过使用恰当命名的aggregate()函数来实现这个函数 - 但我无法让它做我想做的事。
一个简单的例子解释了我使用aggregate()获得的错误如下:
> indices <- seq.Date(as.Date('2000-01-01'),as.Date('2000-01-30'),by="day")
> a <- zoo(rnorm(30), order.by=indices)
> b <- zoo(rnorm(30), order.by=indices)
> c <- zoo(rnorm(30), order.by=indices)
> d <- merge(a,b)
> e <- merge(d,c)
> head(e)
a b c
2000-01-01 -0.07924078 0.6208785 -1.79826472
2000-01-02 1.15956208 1.1867218 -0.02124817
2000-01-03 0.20427523 0.3164863 -0.20153631
2000-01-04 1.21583902 -1.3728278 1.75872854
2000-01-05 -0.32845708 0.3857658 -1.01082787
2000-01-06 -1.95312879 -0.3824591 -1.33220075
>
> aggregate(e,by=e[[1]], nfrequency=8)
Error: length(time(x)) == length(by[[1]]) is not TRUE
所以我在第一道障碍失败了。我将非常感谢帮助我编写函数,帮助我以不同的方式聚合不同的列,并且行数相同。
注意:我只是在用R乱搞'的前几天。据我所知,aggregate()可能不是解决这个问题的方法 - 我不是希望上面代码的片段是一个红色的鲱鱼,并获得如何解决我在使用聚合函数时遇到的问题的答案 - IF aggregate()不是“最佳”(即推荐的R)方法来解决这个问题问题
我将上述尝试包括在内的唯一原因是:
答案 0 :(得分:3)
假设我们希望按周汇总e
,w
,使用a
汇总列sum
,b
使用mean
和{{ 1}}使用一周中的最后一个值:
c
答案 1 :(得分:0)
plyr包中的ddply函数不会对此有帮助吗?
要按多列汇总:
names(e)[1] = 'group'
agg = ddply(e, c("group"), function(df) {
c( sum(df$a), mean(df$b), tail(df$c) )
})
names(agg) = c('group', 'a', 'b', 'c')