【问题标题】:Define start and end within ts function in data.table groupby在 data.table groupby 的 ts 函数中定义 start 和 end
【发布时间】:2018-03-29 16:47:37
【问题描述】:

我正在尝试将具有不同设备的每日数据样本的数据集的特定列转换为按两个键(小时和因子 1)分组的时间序列列

我的数据是这样的

         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-01 到 2017-08-01,hour 有两个级别(AM 和 PM),factor1 有很多级别,目前不需要 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)]

因此我得到了所需的输出,但是当我尝试针对所有不同的 factor1 级别和小时进行总结时,我不知道如何输入正确的开始和结束日期。到目前为止,我设法做到了这一点,但它似乎给出了一个糟糕的输出。

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

任何帮助将不胜感激!

【问题讨论】:

    标签: r data.table time-series


    【解决方案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")
    

    【讨论】:

    • 这不是我正在寻找的答案,但它非常有帮助。我正在寻找的是在同一个数据框中,以某种方式在新列上定义 ts,但每个 ts 是不同的,因为每个 factor1 和 hour 可以有不同的长度......我不知道我是否'我解释自己。无论如何,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2012-04-30
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多