我有一个如下所示的数据集:
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
or没有成功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