R根据另一个datetime变量按组填充datetime数据
我有一个包含POSIXct datetime(t1)数据的数据表,它由多个列组成。对于每个组,我的数据应该有48行,间隔半小时(总共24小时),其日期时间(t1)值由另一个用作分组变量的日期时间(t2)变量确定。48行(t1)数据应为分组日期时间(t2)之前的24小时半小时间隔 我需要用每个组的上一(按时间顺序)完整数据行中的值填充缺少的行 例如:如果按ID=A分组的数据,则datetime(t2)=10-01-2019 06:00:00(格式='dd-mm-yyyy hh:mm:ss')具有从09-01-2019 08:00:00到10-01-2019 04:00:00的datetime(t1)数据。它的范围应为从09-01-2019 06:00:00到10-01-2019 05:30:00,这意味着从一开始就缺少4行数据(2小时),从一结束就缺少3行数据,可用数据点之间也缺少几行数据。虽然在时间段开始时缺少的行不能用完整的数据填充,但我仍然希望将这些行作为NA添加到表中。但是,使用上一个完整数据行中的完整数据填充表末尾的行是非常重要的 我的数据集示例如下所示:(按ID和t2分组)R根据另一个datetime变量按组填充datetime数据,r,datetime,data.table,grouping,padding,R,Datetime,Data.table,Grouping,Padding,我有一个包含POSIXct datetime(t1)数据的数据表,它由多个列组成。对于每个组,我的数据应该有48行,间隔半小时(总共24小时),其日期时间(t1)值由另一个用作分组变量的日期时间(t2)变量确定。48行(t1)数据应为分组日期时间(t2)之前的24小时半小时间隔 我需要用每个组的上一(按时间顺序)完整数据行中的值填充缺少的行 例如:如果按ID=A分组的数据,则datetime(t2)=10-01-2019 06:00:00(格式='dd-mm-yyyy hh:mm:ss')具有从
不清楚时间是否为24小时格式。您可以先创建一个半小时计时序列,然后在使用
zoo::na.locf
进行最后一次观察之前加入原始数据集:
数据:
我的数据的分组变量实际上是ID和t2。当我用稍微不同的数据(包括不同的t2值)尝试您的代码,并将数据表更新为“by=(ID,t2)”,它返回了预期的行数,t1的正确值,但t2的值不正确:它们都与t2的第一个值相同。使用数据:DT,我将代码调整为:DT[DT[,(t1=rev(seq(t2[1L]-30*60,length.out=48L,by=“-30分钟”)),by=(ID,t2)],(ID=i.ID,t2=i.t2,t1=i.t1,varX=na.locf(varX,na.rm=FALSE),varY=na.locf(varY,na.rm=FALSE)),on=(ID,t2,t1)]但是varX和varY的值将被带入下一个组,而不是从NA值开始的下一个组,直到该组的第一个完整数据行出现为止。@Michael96我用新的样本数据集更新了代码。您可能希望在OP中发布此样本数据集,因为它更清晰
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
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")][]