Rのワイド動物園オブジェクトにXTSベクトル操作をすばやく適用してください

StackOverflow https://stackoverflow.com/questions/4318470

  •  29-09-2019
  •  | 
  •  

質問

これは本当に私の延長です 質問 昨日私が学んだ apply.weekly. 。これはうまく機能しますが、私はこれを大きくやりたいです zoo オブジェクト。使用する場合 apply.weekly 広い zoo 列を合計してから、毎週の集約を実行します。

> library(xts)
> set.seed(2001)
> zoo.daily <- zoo(data.frame(a=rnorm(20), b=rnorm(20), c=rnorm(20)), order.by=as.Date("2001-05-25") + 0:19)
> apply.weekly(zoo.daily, sum)
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
  1.091999  -3.017688   3.842305   2.045370 
> apply.weekly(zoo.daily[, 1] + zoo.daily[, 2] + zoo.daily[, 3], sum) 
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
  1.091999  -3.017688   3.842305   2.045370 

私は試しました apply オペレーターの家族ですが、それらは zoo 日付インデックス。でできる for ループですが、それは本当に時間がかかります(はるかに、4倍以上の遅い係数が aggregate 機能します as.yearmon 周期性)。これが次のとおりです for ループ:

week.ends <- index(zoo.daily[endpoints(zoo.daily, "weeks")[-1], ])
num.weeks <- nweeks(zoo.daily)
num.stocks <- ncol(zoo.daily)
zoo.weeks <- zoo(matrix(NA, num.weeks, num.stocks), order.by=week.ends)
for (i in seq(num.stocks)) {
    zoo.weeks[, i] <- apply.weekly(zoo.daily[, i], mean)
}

これは機能します(つまり、各ベクトルを分離します):

2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824

すべての列で迅速に動作する方法はありますか apply.weekly?ありがとう!

更新:Joshua Ulrichは、列の認識機能が必要であると指摘しています( colMeans また colSums)。これを行うと、正しい答えが得られますが、転置されたマトリックスとして。私はただ再生して先に進むべきですか?または、オプション/設定が間違っていますか?

> apply.weekly(zoo.daily, colSums)
        [,1]        [,2]       [,3]        [,4]
a -1.0998912  2.31230989  0.5471894  0.06343824
b -0.3259462  0.02117512  4.3413925  2.86867857
c  2.5178365 -5.35117351 -1.0462765 -0.88674717
役に立ちましたか?

解決

列目覚めの関数をで使用する必要があります apply.weekly. 。たとえば、使用します colSums それ以外の sum また colMeans それ以外の mean.

最近の改訂 xts r-forgeでは、以下の出力を与えます。現在CRAN上のバージョンは、転置されたデータを返します。

# install.packages("xts", repos="http://r-forge.r-project.org")
> apply.weekly(zoo.daily, colSums)
                     a           b          c
2001-05-27 -1.09989120 -0.32594617  2.5178365
2001-06-03  2.31230989  0.02117512 -5.3511735
2001-06-10  0.54718941  4.34139252 -1.0462765
2001-06-13  0.06343824  2.86867857 -0.8867472
> apply.weekly(zoo.daily, colMeans)
                     a            b          c
2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824

カスタム関数を使用する必要がある場合は、の組み合わせを使用できます apply.weeklyapply:

> apply.weekly(zoo.daily, function(x) apply(x,2,mean))
                     a            b          c
2001-05-27 -0.36663040 -0.108648725  0.8392788
2001-06-03  0.33032998  0.003025018 -0.7644534
2001-06-10  0.07816992  0.620198931 -0.1494681
2001-06-13  0.02114608  0.956226189 -0.2955824
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top