重塑长到宽的时间序列数据(每天不等数量的时间序列)

时间:2019-09-20 20:52:28

标签: r time-series reshape

我的问题是前面几个问题的延续:Reshape data.frame from long to wide on time series

但有所不同。是1)每天的小时数不相等(较小)2)日期的开始时间变化(主要)

例如,让我们创建一个数据框,其中包含1)日期,2)小时,3)一些度量-m。如前一篇文章所述,在这里我使用reshape()将长格式转换为宽格式。但是您会看到输出(dt2),而不是从“ m.1”(或从我们的数据集中获取的“ m.2”)开始,而是从“ m.3”开始。 dt数据集的第一行。

dt <- data.frame(Date=as.Date(character()),
                 File=character(), 
                 User=character(), 
                 stringsAsFactors=FALSE) 

date<-as.Date(c("2018-10-1","2018-10-2","2018-10-4"))
date2<-c(rep(date[1],11),rep(date[2],14),rep(date[3],16))
hour<-c(c(3:13),c(2:15),c(4:19))
m<-rnorm(41)
dt<-data.frame(date2,hour, m)

head(dt)
       date2 hour          m
1 2018-10-01    3 -0.9259174
2 2018-10-01    4  0.4172615
3 2018-10-01    5  0.3981876
4 2018-10-01    6 -0.1894735
5 2018-10-01    7  0.7387315
6 2018-10-01    8  1.2337722

If I use the 
library(reshape) 
dt2<-reshape(dt, idvar =c("date2"), timevar ="hour", direction = "wide")
dt2
        date2        m.3        m.4       m.5        m.6        m.7         m.8        m.9         m.10       m.11      m.12       m.13
1  2018-10-01 -0.9259174  0.4172615 0.3981876 -0.1894735  0.7387315  1.23377223 -0.3740326 -0.007818602 -1.7822049 -1.304608 -1.2114172
12 2018-10-02  0.4961225 -0.6928343 0.5495917  1.9807136 -2.6065999 -1.78083806  1.3777553 -0.543557423 -0.6153750  1.223758 -1.0254392
26 2018-10-04         NA  0.6442237 0.5019143  0.5550032 -1.5300680 -0.08084971  0.5487069  0.618540806  0.3787519  0.219644  0.6488434
        m.2       m.14       m.15      m.16      m.17     m.18      m.19
1        NA         NA         NA        NA        NA       NA        NA
12 -1.54329  0.1743518 -2.3307605        NA        NA       NA        NA
26       NA -1.3063877 -0.6920828 -0.194381 -1.144777 1.585792 -1.320353

我要解决的一个办法是先填充缺失值。但是这需要很长时间-想象数千天。

dt_full <- data.frame(Date=as.Date(character()),
                 File=character(), 
                 User=character(), 
                 stringsAsFactors=FALSE) 
 udate<-unique(dt$date2)
 ludate<-length(udate)
for(j in 1:ludate){
    dt_sub<-subset(dt,date2==udate[j])

    full_minute<-data.frame(2:19,udate[j])
    colnames(full_minute)<-c("hour","date2")

    dt_sub_full <-full_join(dt_sub,full_minute,by=c("hour"="hour","date2"="date2"))
    o<-order(dt_sub_full["hour"])
    dt_sub_full <-dt_sub_full[o,]
    dt_full <-rbind(dt_sub_full,dt_full)
 }

dt_full2<-reshape(dt_full, idvar =c("date2"), timevar ="hour", direction = "wide")
    dt_full2
         date2      m.2        m.3        m.4       m.5        m.6        m.7         m.8        m.9         m.10       m.11      m.12
17  2018-10-04       NA         NA  0.6442237 0.5019143  0.5550032 -1.5300680 -0.08084971  0.5487069  0.618540806  0.3787519  0.219644
110 2018-10-02 -1.54329  0.4961225 -0.6928343 0.5495917  1.9807136 -2.6065999 -1.78083806  1.3777553 -0.543557423 -0.6153750  1.223758
121 2018-10-01       NA -0.9259174  0.4172615 0.3981876 -0.1894735  0.7387315  1.23377223 -0.3740326 -0.007818602 -1.7822049 -1.304608
          m.13       m.14       m.15      m.16      m.17     m.18      m.19
17   0.6488434 -1.3063877 -0.6920828 -0.194381 -1.144777 1.585792 -1.320353
110 -1.0254392  0.1743518 -2.3307605        NA        NA       NA        NA
121 -1.2114172         NA         NA        NA        NA       NA        NA

我的问题是,请您帮我考虑一下解决此问题的更快方法吗?提前非常感谢您!

0 个答案:

没有答案