2017-10-17 3 views
0

データセットの特定の列を、異なるデバイスのデータの日々のサンプルを使って2つのキー(時間と係数1)でグループ化された時系列列に変換しようとしていますdata.tableのts関数内でstartとendを定義するgroupby

私が持っているデータは、この

  date hour factor1 volume wkday 
1: 2015-10-01  AM 11011 530 Thursday  
2: 2015-10-01  AM 11012 1535 Thursday  
3: 2015-10-01  AM 11021 191 Thursday  
4: 2015-10-01  AM 11131 1108 Thursday  
5: 2015-10-01  AM 11132 1518 Thursday  
6: 2015-10-01  AM 11141 508 Thursday  

日は2015年10月1日から2017年8月1日に実行されるように、時間は、以下の2つのレベル(AMとPM)が、因数1は、多くのレベルと平日を持っているものです今のところ必要ありません。 timeseriesデータに変換したい列はボリュームです。

私はこれを行う試してみました:

table_11011 = table[factor1 == '11011'] 
table_11011_am = table_11011[hour == 'AM'] 

table_11011_am[, vol_ts := ts(table_11011_am[,volume], 
        start = decimal_date(table_11011_am[, date][1]), 
        frequency = 365)] 

したがって、私は所望の出力を得るが、私はすべての異なる因数1レベルと時間のためにこれを要約しようとしたとき、私は入力にどのように正しい開始と終了を知りません日付。今まで私はこれをやっていましたが、それは悪い結果を与えるようです。

table[, vol_ts := ts(volume, 
        start = decimal_date(table[, date][1]), frequency = 365), by = c('factor1', 'hour')] 

助けてください。

答えて

1

私がここで意図した使用法に従っているかどうかはわかりませんが、同様の問題にどのように近づくかについてはここで突き止めます。

基本的には、seq.Date()を使用して通常の一連の日付を生成し、data.tableのCJ()(クロスジョイン)機能を使用して時間と要因の組み合わせごとにそのシリーズを繰り返すことができます。

定期的なシリーズを取得したら、生データに参加して、あなたが探しているデータを定期的に取得することができます。 Rの特殊な時系列タイプのオブジェクトを実際に扱ったことはありません。data.tablezoo、およびRcppRollパッケージを使用して、私が必要とするすべてを達成することができました。

これは何らかの助けになるかもしれません。

library(data.table) 

DT <- data.table(Date = as.Date(c("2015-10-01","2015-10-25","2015-11-04","2015-11-06")), 
       hour = c("AM","PM","AM","PM"), 
       factor1 = c("A","B","C","D"), 
       volume = c(1,2,3,4)) 

## Create a regular sequence of all dates in range 
## with a row for each combo of hour and factor1 
TS <- CJ(Date = seq.Date(from = DT[,min(Date)], to = DT[,max(Date)],by = "day"), 
     hour = DT[,unique(hour)], 
     factor1 = DT[,unique(factor1)]) 

## Join the data to this expanded time series 

setkey(DT,Date,hour,factor1) 
setkey(TS,Date,hour,factor1) 

TS <- DT[TS] 

## Fill with zeros if necessary 
TS[is.na(volume), volume := 0] 

## If you want a separate column for factor level 
Wide <- dcast(TS, ... ~ factor1, value.var = "volume") 

## Or if you want a column (time series) for each combo 
VeryWide <- dcast(TS, ... ~ factor1 + hour, value.var = "volume") 
+0

これは正確に私が探していた答えではありませんが、非常に役に立ちました。私が探しているのは、同じデータフレーム内で、ある意味で新しい列のTSを定義することですが、それぞれのfactor1とtimeの長さが異なるため、それぞれのTSは異なります...私は、自分自身を説明しています。とにかく、ありがとうございました。 –

関連する問題