0

価格とボリュームを含むxtsオブジェクトがあります。データを期間ごとに分割し、データを集計して、各期間の分割について、各価格で取引されたボリュームのテーブルを取得したいと思います。

私は部分的な解決策を一緒にハックしましたが、それは不格好で遅いです。さらに、テンプレート名を使用して機能させることができません(したがって、関数を機能させることができません)。

xtsオブジェクトのサブセットを以下に示します。

library(xts)
mn <- 
structure(c(97.9, 97.9, 97.9, 97.9, 97.9, 97.9, 97.9, 97.89, 
97.89, 97.89, 97.89, 97.89, 97.89, 97.9, 97.9, 97.89, 97.9, 97.89, 
97.89, 97.89, 97.89, 9, 60, 71, 5, 3, 21, 5, 192, 65, 73, 1, 
1, 39, 15, 1, 1, 18, 1, 33, 1, 1), .Dim = c(21L, 2L), .Dimnames = list(
    NULL, c("px_ym1", "vol_ym1")), index = structure(c(1338561000, 
1338561000, 1338561000, 1338561000, 1338561000, 1338561000, 1338561060, 
1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 
1338561060, 1338561060, 1338561060, 1338561060, 1338561060, 1338561120, 
1338561240, 1338561240), tzone = "", tclass = c("POSIXct", "POSIXt"
)), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", 
"POSIXt"), .indexTZ = "", tzone = "", class = c("xts", "zoo"))

次のコマンドを使用して集計する方法を理解しました。

PxMat <- aggregate(.~px_ym1, data=mn, sum)
  px_ym1 vol_ym1
1  97.89     408
2  97.90     208

サブセットの場合、次のグループ化を使用します。

PxMat2 <- aggregate(.~px_ym1, data=mn[.indexmin(mn) == '30'], sum)
  px_ym1 vol_ym1
1   97.9     169

私は4つの特定の質問があります:

1 /私のデータセットは巨大なので、速度が問題になります。これは、xtsをサブセット化して集約するための最速の方法ですか?

2 /複数の分割に対してこれを行う方法はありますか?分、日、週、または月ごとにテーブルを言いますか?

私は、指定された時分割の各ケースの各価格で取引されたボリュームを報告するテーブルを生成するループを備えた関数を書いています(たとえば、4つのテーブル、例のデータでは1分ごとに1つ)。それは遅いようで、誰かがすでにもっとうまくやっていたであろう何かのようです。これは本当ですか?

3 /テンプレート変数を使用してサブセット化を行う方法はありますか?列名は時々異なるため、複数のデータフレームを持つ名前付き集計関数(上記で再現)で取得したテーブルを取得したいと思います。

私が試してみました:

PxMat <- aggregate(.~mn[,1], data=mn, sum)
  px_ym1  px_ym1 vol_ym1
1  97.90 1076.79     408
2  97.89  979.00     208

これは大惨事ではありませんが、複数の列がある場合は、混乱を最小限に抑えたいと思います。価格系列の集計を抑制する方法がわかりません。

4 /関連する注記で、データの異なる列に異なる関数を適用することは可能ですか?たとえば、返されたテーブルが次のようになっていると便利です。

px_ym1  count vol_ym1
1  97.90  11     408
2  97.89  10     208

R-helpへのクロスポスト:https ://stat.ethz.ch/pipermail/r-help/2012-June/315499.html

4

1 に答える 1

1

私はあなたに電子メールで(そしてまだ現れていませんが助けてくれるように)あなたが試すことを提案しました:

adf <- aggregate(vol_ym1 ~ px_ym1, data=mm, sum)

そして、これを匿名で実行したいが、使用できる集計列の合計を削除したい場合は、次のようにします。

adf <- aggregate(mm[,-1]~mm[,1], data=mm, sum); adf

別の列が必要な場合は、分割基準によって分離された完全なベクトルまたは行列を操作する関数を作成する必要があります。具体的な答えを得るには、より豊富な例が必要になります。

于 2012-06-13T13:43:41.980 に答える