R дополняет данные даты и времени группами на основе другой переменной даты и времени - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица данных с данными POSIXct datetime (t1), которая сгруппирована по нескольким столбцам.Мои данные должны иметь 48 строк с получасовыми интервалами (всего 24 часа) для каждой группы, чье значение datetime (t1) определяется другой переменной datetime (t2), используемой как часть переменных группировки.48 строк данных (t1) должны составлять 24 часа с получасовыми интервалами, ведущими к сгруппированной дате и времени (t2).

Мне нужно заполнить пропущенные строки значениями из предыдущей (хронологически) полной строки данных для каждой группы.

Например: если данные сгруппированы по ID = A, datetime (t2) = 10-01-2019 06: 00: 00 (format = '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 голосов
/ 07 февраля 2019

Не ясно, если время в 24-часовом формате.Вы можете сначала создать последовательность получасовых временных интервалов, затем объединить с исходным набором данных, прежде чем использовать zoo::na.locf для переноса последнего наблюдения вперед:

data:

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]

code:

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")][]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...