R根据另一个日期时间变量按组填充日期时间数据
R padding datetime data by groups based on another datetime variable
我有一个数据 table,其中包含按多列分组的 POSIXct 日期时间 (t1) 数据。对于每个组,我的数据应该以半小时为间隔(总共 24 小时)有 48 行,其日期时间 (t1) 值由用作分组变量一部分的另一个日期时间 (t2) 变量确定。 48 行 (t1) 数据应该是 24 小时的半小时间隔,直到分组的日期时间 (t2)。
我需要用每个组的前(按时间顺序)完整数据行的值填充缺失的行。
例如:如果按ID分组的数据=A,datetime(t2)=10-01-201906:00:00(format='dd-mm-yyyy hh:mm:ss' ) 具有从 09-01-2019 08:00:00 到 10-01-2019 04:00:00[=25= 的日期时间 (t1) 数据].它应该跨越 09-01-2019 06:00:00 到 10-01-2019 05:30:00,这意味着 4 行数据(2 小时)从头开始丢失,3 行数据从最后丢失,并且在可用数据点之间也丢失了几行。虽然无法用完整数据填充时间段开始时缺失的行,但我仍然希望将这些行添加到 table 作为 NA。但是,table 末尾的行必须填充上一个完整数据行的完整数据,这一点非常重要。
我的数据集示例如下所示:(按 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
不清楚时间是否为 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")][]
我有一个数据 table,其中包含按多列分组的 POSIXct 日期时间 (t1) 数据。对于每个组,我的数据应该以半小时为间隔(总共 24 小时)有 48 行,其日期时间 (t1) 值由用作分组变量一部分的另一个日期时间 (t2) 变量确定。 48 行 (t1) 数据应该是 24 小时的半小时间隔,直到分组的日期时间 (t2)。
我需要用每个组的前(按时间顺序)完整数据行的值填充缺失的行。
例如:如果按ID分组的数据=A,datetime(t2)=10-01-201906:00:00(format='dd-mm-yyyy hh:mm:ss' ) 具有从 09-01-2019 08:00:00 到 10-01-2019 04:00:00[=25= 的日期时间 (t1) 数据].它应该跨越 09-01-2019 06:00:00 到 10-01-2019 05:30:00,这意味着 4 行数据(2 小时)从头开始丢失,3 行数据从最后丢失,并且在可用数据点之间也丢失了几行。虽然无法用完整数据填充时间段开始时缺失的行,但我仍然希望将这些行添加到 table 作为 NA。但是,table 末尾的行必须填充上一个完整数据行的完整数据,这一点非常重要。
我的数据集示例如下所示:(按 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
不清楚时间是否为 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")][]