1

1 日のデータセットに基づく以下のコードを使用して、一意の分単位で情報を集計するデータがあります。ただし、複数日を組み合わせたデータファイルでこのコードを実行できるようにしたいと考えています。データセットに日付列があるので、それを毎日の一意の識別子として使用できます。日付が同じでない場合、1 分単位でデータを集計する方法はありますか?

問題は、unique 関数が初日に発生した一意のイベントを抽出し、その後その分に発生したすべての同じイベントを追加することです。私も日付に基づいている場合、1 つの長いデータセットで、毎日の一意の 1 分間のエントリを作成できると思います。

以下は、1 日のデータに対して機能するコードです。

novo <- read.csv("C:/Users/Morten/Desktop/data.csv", header = TRUE, stringsAsFactors=FALSE  )

TimeStamp <- novo[,1]
price <- novo[, 2]
volume <- novo[,3]
nV <- sum(volume) 

MinutesFloor <- unique(floor(TimeStamp))
nTradingMinutes <- length(MinutesFloor)

PriceMin <- rep(0, nTradingMinutes)
VolumeMin <- rep(0, nTradingMinutes)

for( j in 1:nTradingMinutes){
    ThisMinutes <- (floor(TimeStamp) == MinutesFloor[j])
    PriceMin[j] <- mean(price[ThisMinutes])
    VolumeMin[j] <- sum(volume[ThisMinutes])

    }

前もって感謝します

データ形式:

日付、 "ord"、 "shares"、 "finalprice"、 "time"、 "stock"
20100301、c、80,389,540.004,1158
20100301、c、77,389,540.004,1158
20100301、C、C、60,389,540.004,1158 20158
20100301、C、
28,1589,5040.0040.004 ,C,7,389,540.004,1158
20100302,C,25,394.7,540.00293333,1158
20100302,C,170,394.7,540.00293333,1158
20100302,C,40,394.7,540.00293333,1158
20100302,C,75,394.7,540.00293333,1158
20100302,C,100,394.7,540.00293333, 1158
20100302,C,1,394.7,540.00293333,1158

4

1 に答える 1

3

あなたのコードの根本的に単純化されたバージョンを提案したいと思います。

あなたはかなり非効率的なことをかなりやっています。R は、異なるデータ値でクラスター化された要約統計量を計算するように作られています。この方法を多用します。

あなたのデータはあなたが提供した形式であると思います。私のシステムでは、これは次のようになります

novo <- read.csv("test.csv", header = TRUE, stringsAsFactors=FALSE  )

これにより、次のことがわかります。

> str(novo)
'data.frame':   11 obs. of  6 variables:
 $ date      : int  20100301 20100301 20100301 20100301 20100301 20100302 20100302 20100302 20100302 20100302 ...
 $ ord       : chr  "C" "C" "C" "C" ...
 $ shares    : int  80 77 60 28 7 25 170 40 75 100 ...
 $ finalprice: num  389 389 389 389 389 ...
 $ time      : num  540 540 540 540 540 ...
 $ stock     : int  1158 1158 1158 1158 1158 1158 1158 1158 1158 1158 ...

ここで、あなたの日付が YearMonthDate であると仮定します。順序が異なる場合は、以下の format コマンドを変更する必要があります。さらに、timeおそらく数分です。

POSIXct次に、データ型を使用して日付と時刻の両方を含むタイムスタンプを作成できます。

timestamps <- as.POSIXct(as.character(novo$date), format='%Y%m%d') + novo$time*60

cutここで、因子変数を作成し、関数を使用して、分の切り上げを行います。

timestampsByMinute <- droplevels(cut(timestamps, 'min'))

droplevels追加機能は、利用可能なデータ項目がない分を削除するだけであることに注意してください。

for最後に、 -loopで行った要約統計を計算できます。

tapply最初の引数を取り、2 番目の引数で定義されたグループに分割し、3 番目の引数として指定された関数をそのデータに適用する関数です。したがってtapply、データに関数をスローするだけかもしれません。(コードで使用した列番号がサンプルデータの列名と一致しないと感じています-意味を間違って解釈した場合は、別の列に自由に適応してください)

PriceMin <-  tapply(novo$finalprice, timestampsByMinute, mean)
VolumeMin <- tapply(novo$shares, timestampsByMinute, sum)

これにより、

> PriceMin
2010-03-01 09:00:00 2010-03-02 09:00:00 
              389.0               394.7 
> VolumeMin
2010-03-01 09:00:00 2010-03-02 09:00:00 
                252                 411

これはおそらくあなたが望むものです。

tapply使用したループよりもはるかに高速であることに注意してください。巨大なデータファイルがある場合、これが重要になることがあります。

コードにエラーが残っていないことを願っています。1 日 1 分間のデータしか提供していないという事実を考えると、テストは容易ではありませんでした。


編集:

リクエストに応じて、データから時刻情報を削除する小さな変更を以下に示します。

> unname(VolumeMin)
[1] 252 411

> unname(PriceMin)
[1] 389.0 394.7
于 2012-11-21T20:32:32.163 に答える