У меня есть набор данных, который выглядит следующим образом:
id land datetime
pb1 0 2004-04-05 01:44:00
pb1 1 2004-04-05 02:00:00
pb1 1 2004-04-05 16:00:00
pb2 1 2004-04-05 18:01:00
pb2 1 2004-04-05 20:00:00
library(data.table)
DT = data.table(
id = c("pb1", "pb1", "pb1", "pb2", "pb2"),
land = c(0L, 1L, 1L, 1L, 1L),
datetime = sprintf("2004-04-05 %02d:%02d:00",
c(1, 2, 16, 18, 20),
c(44, 0, 0, 1, 0))
)
Я хотел бы создать столбец, который кумулятивно добавляет время (в днях), но ТОЛЬКО если в land
есть '1'колонка.Я также хотел бы сбросить счетчик при изменении id
.
Я пробовал различные методы, используя data.table
, rleid
и даже вложенный цикл for
, но безуспешно.Я получил ошибки, используя код, подобный следующему:
DT[, total :=land*diff(as.numeric(datetime)), .(id, rleid(land))]
Я пробовал варианты решения здесь: Расчет совокупного времени в R
Я не уверен, чтолучший способ вычислить временной интервал (без успеха с difftime
или lubridate
).
Я хочу, чтобы конечный результат выглядел так:
id land datetime cumtime.land
pb1 0 2004-04-05 01:44:00 0
pb1 1 2004-04-05 02:00:00 0
pb1 1 2004-04-06 16:00:00 1.58333
pb2 1 2004-04-05 18:00:00 0
pb2 1 2004-04-05 20:00:00 0.08333