2017-10-17 43 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可以有不同的长度......我不知道我是否在'解释我自己。无论如何,非常感谢你的帮助。 –

相关问题