簡體   English   中英

R Zoo對象時間序列聚合

[英]R zoo object time series aggregation

我有一個R動物園物體。 動物園對象(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()可能不是解決此問題的方法-我不希望上面的代碼片段是紅鯡魚,並收到有關如何解決使用聚合函數時遇到的問題的答案-IF Aggregate()不是解決此問題的“最佳”(即推薦的R)方式。

我在上面進行嘗試的唯一原因是:

  1. 因為要求我發布“可重現”錯誤
  2. 為了說明我在嘗試在這里之前先嘗試自己解決問題。

假設我們希望按周w匯總e ,使用sum匯總列a ,使用mean匯總b使用一周中的最后一個值匯總c

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM