【问题标题】:R zoo object time series aggregationR动物园对象时间序列聚合
【发布时间】:2012-02-27 10:57:15
【问题描述】:

我有一个 R 动物园对象。 zoo 对象 (z) 是按日期索引的,并且有多个列:

  • V1(聚合值是“选定”行中所有值的总和)
  • V2(聚合值是“选定”行中所有值的 q1 [第一个四分位数])
  • V3(聚合值是“选定”行中所有值的最小值)
  • V4(聚合值是“选定”行中所有值的第一个值)
  • v5(聚合值是“选定”行中所有值的最后一个值)

我想以不同方式聚合每个“列”中的数据(即使用不同的函数),但聚合相同的行数。

我想使用一个函数进行聚合,该函数允许我指定要聚合的行数。例如:

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() 可能不是解决这个问题的方法——我不是希望上面代码的 sn-p 是一条红鲱鱼,并收到有关如何解决我在使用聚合函数时遇到的问题的答案 - IF aggregate() 不是“最佳”(即推荐的 R)方法解决这个问题。

我在上面进行尝试的唯一原因是:

  1. 因为我被要求发布“可重现”错误
  2. 为了表明我已经尝试自己先解决它,然后再在这里提问。

【问题讨论】:

  • 请提供可重现的内容。

标签: r aggregate aggregation zoo


【解决方案1】:

假设我们希望按周聚合 ew,聚合列 a 使用 sumb 使用 meanc 使用一周中的最后一个值:

w <- as.numeric(format(time(e), "%W"))
e.w <- with(e, cbind(a = aggregate(a, w, sum), 
    b = aggregate(b, w, mean), 
    c = aggregate(c, w, tail, 1)
))

【讨论】:

  • @GGrothendiek:这正是我完全考虑的方式......很高兴知道我在正确的轨道上。最后一件事是我想按天聚合,我将天数作为正整数传递给函数。我不清楚我如何修改你的 sn-p 来做到这一点。您能否展示我如何聚合数字而不是字符串表示形式(例如 7 而不是“W”)?谢谢
  • nextfrihttp://cran.r-project.org/web/packages/zoo/vignettes/zoo-quickref.pdf
  • @GGrothendiek:我可能在这里遗漏了一些想法……我查看了 nextfri 函数。我可以看到它如何用于 DOW 聚合,但我看不到它如何用于聚合行数(即不考虑星期几)。例如,如果我想汇总 3 天内的数据,我不确定 nextfri 示例有何帮助。
  • @Homunculus,如果您正在寻找数据集中所有星期日的总和/平均值/尾,那么第二行是所有星期一的总和/平均值/尾,依此类推,然后替换 @ 987654331@ 和%w
  • @GGrothendiek:我的聚合逻辑与 DOW(星期几)无关。它根据指定的行数进行聚合 - 并且不关心星期几。数据毕竟是不规则的,因此数据中可能缺少某些日期。我想要做的就是能够根据间隔来汇总(即汇总)数据,该间隔指定要汇总数据的天数。
【解决方案2】:

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')

【讨论】:

    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 2015-02-16
    • 2012-02-27
    • 2012-03-30
    • 2012-12-30
    • 2017-10-14
    • 2013-05-15
    • 1970-01-01
    相关资源
    最近更新 更多