6

たとえば、xts午前 9 時 30 分から午後 4 時 30 分までの楽器 x の量 (形式)について、10 年分の毎日の 1 分間のデータがあるとします。

    Date.Time               Volume        
    2001-01-01 09:30:00     1200
    2001-01-01 09:31:00     1110
    2001-01-01 09:32:00     1303

までずっと:

    2010-12-20 16:28:00     3200
    2010-12-20 16:29:00     4210
    2010-12-20 16:30:00     8303

私はしたいと思います:

  • シリーズ全体の毎分平均ボリュームを取得します (つまり、9:30、9:31、9:32...16:28、16:29、16:30 における 10 年間の平均ボリューム)。

どうすればいいですか:

  • データを 1 分のバケットに集約する
  • それらのバケットの平均を取得する
  • それらの「平均的な」バケットを単一の xts/zoo 時系列に再構成しますか?

aggregatesapply、関数などをうまくいじりましたがperiod.apply、データを正しく「ビン化」できないようです。

これをループで解決するのは簡単ですが、非常に遅いです。プログラムによる解決策を避け、C++ アーキテクチャを利用する関数 (つまり、xtsベースの解決策)を使用したい

誰でもアドバイス/解決策を提供できますか?

よろしくお願いします。

4

2 に答える 2

5

まず、いくつかのテスト データを作成します。

library(xts) # also pulls in zoo
library(timeDate)
library(chron) # includes times class

# test data
x <- xts(1:3, timeDate(c("2001-01-01 09:30:00", "2001-01-01 09:31:00", 
    "2001-01-02 09:30:00")))

1) アグリゲート.ズー. それをクラスに変換し、timesこのワンライナーを使用して集約してみてください。

aggregate(as.zoo(x), times(format(time(x), "%H:%M:%S")), mean)

1a) aggregate.zoo (バリエーション) . timesまたは、短い集計シリーズを変換して、長い元のシリーズでそれを行う必要がないようにするこのバリエーション:

ag <- aggregate(as.zoo(x), format(time(x), "%H:%M:%S"), mean)
zoo(coredata(ag), times(time(ag)))

2) タップします。代替案は、tapplyどちらがより高速であるかです。

ta <- tapply(coredata(x), format(time(x), "%H:%M:%S"), mean)
zoo(unname(ta), times(names(ta)))

編集:(1)を簡素化し、(1a)および(2)を追加

于 2012-02-24T13:25:15.260 に答える
3

これは を使用した解決策ですが、おそらく、、、などddplyも使用できます。sqldftapplyaggregateby

# Sample data
minutes <- 10 * 60
days <- 250 * 10
d <- seq.POSIXt( 
  ISOdatetime( 2011,01,01,09,00,00, "UTC" ), 
  by="1 min", length=minutes 
)
d <- outer( d, (1:days) * 24*3600, `+` )
d <- sort(d)
library(xts)
d <- xts( round(100*rlnorm(length(d))), d )

# Aggregate
library(plyr)
d <- data.frame( 
  minute=format(index(d), "%H:%M"), 
  value=coredata(d) 
)
d <- ddply( 
  d, "minute", 
  summarize, 
  value=mean(value, na.rm=TRUE) 
)

# Convert to zoo or xts
zoo(x=d$value, order.by=d$minute) # The index does not have to be a date or time
xts(x=d$value, order.by=as.POSIXct(sprintf("2012-01-01 %s:00",d$minute), "%Y-%m-%d %H:%M:%S") )
于 2012-02-24T07:18:07.917 に答える