R基于另一个日期时间变量按组填充日期时间数据

时间:2019-02-07 00:07:48

标签: r datetime data.table grouping padding

我有一个包含POSIXct datetime(t1)数据的数据表,该数据表由多列分组。对于每个组,我的数据应每隔半小时间隔有48行(总共24小时),其日期时间(t1)值由用作分组变量一部分的另一个日期时间(t2)变量确定。 (t1)数据的48行应为半小时间隔的24小时,直到分组的日期时间(t2)。

我需要使用每个组的上一个(按时间顺序)完整数据行中的值填充缺少的行。

例如:如果按ID分组的数据为A,则日期时间(t2)= 2019年1月10日06:00:00 (格式='dd-mm-yyyy hh:mm: ss')的日期时间(t1)数据范围为 09-01-2019 08:00:00 10-01-2019 04:00:00 。它的范围应从 09-01-2019 06:00:00 10-01-2019 05:30:00 ,这意味着有4行数据(2小时)是从开始丢失,从末尾丢失3行数据,在可用数据点之间也丢失几行。虽然在时间段开始时缺少的行无法填充完整的数据,但我仍希望将这些行作为NA添加到表中。但是,使用来自上一个完整数据行的完整数据填充表末尾的行非常重要。

我的数据集示例如下所示((按ID和t2分组)

ID t2                   t1                    varX   varY
... 
A  10-01-2019 06:00:00  10-01-2019 12:00:00   100    Y1 
A  10-01-2019 06:00:00  10-01-2019 12:30:00   60     Y2 
B  10-01-2019 06:00:00  10-01-2019 01:00:00   100    Y2 
A  10-01-2019 06:30:00  10-01-2019 01:30:00   100    Y3 
B  10-01-2019 06:30:00  10-01-2019 02:00:00   200    Y4  
C  10-01-2019 07:00:00  10-01-2019 04:00:00   100    Y3  

1 个答案:

答案 0 :(得分:1)

不清楚时间是否为24小时格式。您可以先创建一个半小时的时间序列,然后在使用zoo::na.locf进行最后一次观察之前与原始数据集合并:

数据:

library(data.table)
DT <- fread("ID,t2,t1,varX,varY
A,10-01-2019 06:00:00 PM,10-01-2019 12:00:00 PM,100,Y1 
A,10-01-2019 06:00:00 PM,10-01-2019 12:30:00 PM,60,Y2 
B,10-01-2019 06:00:00 PM,10-01-2019 01:00:00 PM,100,Y2 
A,10-01-2019 06:30:00 PM,10-01-2019 01:30:00 PM,100,Y3 
B,10-01-2019 06:30:00 PM,10-01-2019 02:00:00 PM,200,Y4 
C,10-01-2019 07:00:00 PM,10-01-2019 04:00:00 PM,100,Y3") 
cols <- c("t2", "t1")
DT[, (cols) := lapply(.SD, as.POSIXct, format="%d-%m-%Y %I:%M:%S %p"), .SDcols=cols]

代码:

library(zoo)
DT[DT[,.(t1=rev(seq(t2-30*60, length.out=48L, by="-30 mins"))), by=.(ID, t2)],
    .(ID=i.ID, t2=i.t2, t1=i.t1, varX=varX, varY=varY),
    on=.(ID, t2, t1)][,
        c("varX", "varY") := lapply(.SD, na.locf, na.rm=FALSE),
        , by=.(ID, t2), .SDcols=c("varX", "varY")][]