Метод заключается в создании «полной» таблицы данных со всеми диапазонами дат по переменным g1 и g2. Затем мы делаем левое соединение с исходной таблицей data.table и затем заполняем статус NA
.
Это все еще зависит от другого пакета для выполнения метода fill
. Я не мог заставить tidyr::fill
работать, но zoo::na.locf
работал как шарм. Существует множество других вариантов заполнения значений NA.
Заменить NA последним не-NA в data.table, используя только data.table
R data.table соединение / поднабор / совпадение по группе и по условию
Замена NA с последним значением не-NA
setorder(dt, g1, g2, date_obs)
dt_complete <- dt[, .(date_obs = seq.Date(min(date_obs), max(date_obs), by = "day")), by = .(g1, g2)]
dt[dt_complete
, on = c('date_obs', 'g1', 'g2')
, .(g1, g2, date_obs, status = zoo::na.locf(status))
]
g1 g2 date_obs status
1: 1 1 2019-01-02 0
2: 1 2 2019-01-01 1
3: 1 2 2019-01-02 1
4: 1 2 2019-01-03 1
5: 1 2 2019-01-04 1
6: 1 2 2019-01-05 1
7: 1 2 2019-01-06 1
8: 1 2 2019-01-07 1
9: 1 2 2019-01-08 1
... 38 total rows...
Данные , что просто ОП:
library(data.table)
library(tidyverse)
# 1. Data set
dt <- data.table(
g1 = c(1, 1, 2, 1, 2, 2, 1),
g2 = c(2, 1, 3, 3, 1, 1, 2),
status = c(1, 0, 1, 0, 0, 1, 1),
date_obs = as.Date(c("2019-01-01", "2019-01-02", "2019-01-12", "2019-01-15",
"2019-01-20", "2019-01-24", "2019-01-30")))