2017-10-17 42 views
0

我試圖將數據集的特定列與不同設備的日常數據樣本轉換爲按兩個鍵(小時和因子1)分組的時間序列列表在data.table組中的ts函數中定義開始和結束

我的數據是這樣的

  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日,時有兩個級別(AM和PM),因子1具有多層次,wkday是目前不需要。我想變成時間序列數據的列是音量。

我試着這樣做:

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

不知道我是否100%按照預期的用法在這裏,但這裏是一個刺我怎麼可能接近類似的問題。

基本上,您可以使用seq.Date()生成一系列常規日期,然後使用data.table的CJ()(交叉連接)函數爲您的小時和因素的每個組合重複該系列。

一旦你有一個常規系列,你可以加入你的原始數據,以獲得我認爲你正在尋找的定期間隔的數據。我從來沒有真正處理R中的專用時間序列類型對象,我總是能夠通過data.tablezooRcppRoll包完成我所需的一切。

希望這可能會有所幫助。

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,但每個ts是不同的,因爲每個factor1和hour可以有不同的長度......我不知道我是否在'解釋我自己。無論如何,非常感謝你的幫助。 –

相關問題