2016-05-17 9 views
1

私は、8日間の間隔で集計したい日次データの複数年(1985-2010)時系列を持っています。年1回のR時系列の集計日

library(zoo) 
indices <- seq.Date(as.Date("1985-01-01"), as.Date("1988-12-31"), by = 'day') 
a.zoo <- zoo(rnorm(length(indices)), order.by = indices) 

head(a.zoo) 
1985-01-01 1985-01-02 1985-01-03 1985-01-04 1985-01-05 1985-01-06 
0.47454560 -1.10429098 -1.27926702 0.46199385 -0.12975014 0.03752185 

が、私はrollapply使用することができます。問題は、私は例の動物園のオブジェクトを構築する場合は、各年の最初の間隔が

1月1日に開始する必要がありますので、私は、毎年恒例の結果を分析するに興味があるということですそこに行く道の一部を取得する:

rollapply(a.zoo, 8, by=8, by.column=FALSE, FUN=function(x) mean(x), align = "left") 

しかし、年の区別がないので、最初の年間間隔の開始日が異なります。私は、データフレームに動物園のオブジェクトを変換する場合、私は年によって関数を適用するplyrコマンドを使用することができます。

library(plyr) 
a.df <- data.frame(date = time(a.zoo), 
        data = a.zoo, 
        check.names = F, 
        row.names = NULL) 
a.8 <- dlply(a.df, .(format(date, "%Y")), 
      function(x) {split(x$data, ceiling(seq_along(x$data)/8))}) 
a8.mean <- rapply(a.8, mean, na.rm = T) 

head(a8.mean) 
    1985.1  1985.2  1985.3  1985.4  1985.5  1985.6 
-0.2744355 0.3103211 0.2057675 -0.1537141 0.6807115 -0.1581474 

が、私は、日付情報を失います。誰かが毎年1月1日に始まる8日間の間隔でタイムタグ付けされたデータを得るように、誰かが1つのアプローチまたは他の方法を調整する方法についての提案を持っていますか(または新しい、より賢明なアイデアを提供できますか?助けてくれてありがとう!

答えて

1

私はこの解決策にこのSO答えを使用しました。基本的には年によってzooオブジェクトを分割:次に

a.yr = tapply(a.zoo, format(index(a.zoo), "%Y"), c) 

あなたがやっていたとして毎年、rollapplyを適用します。

rollapply(a.yr$`1985`, 8, by=8, by.column=FALSE, FUN=function(x) mean(x), align = "left") 

あなたはmergeの動物園のオブジェクトです。

+1

おかげに割り当て、あなたの第二のアプローチの名前を抽出することができます!これは正しい軌道に乗った。私はlapplyを使いました:a.list < - lapply(a.yr、function(x)zoo(rollapply(x、8、by = 8、by.column = 'FALSE、FUN = function(y)mean(y)、align =" left ")))') 'do.call(" rbind "、a.list)'のようになります。最終的にこれと以下の解決策との唯一の違いは、 'rollapply'は、指定された数(この場合は8)未満の任意の間隔の値を返さないということです。 – Jaywalker

1

これが最良の答えではないかもしれませんが、あなたは、あなたのa8.mean結果

a8.name <- (dlply(a.df, .(format(date, "%Y")), function(x) x$date[seq_along(x$date) %% 8 == 1])) 
names(a8.mean) <- do.call(c, a8.name) 
+0

これも同様に機能しました! 'do.call'コマンド中の名前は"日付 "形式から取り除かれましたが、結果を動物園のオブジェクトに変換するのは簡単でした:' a8.mean.zoo < - zoo(a8.mean、order.by = as。日付(名前(a8.mean))) 'ありがとう! – Jaywalker

関連する問題