Вот вариант:
DT[, g := rleid(id, as.IDate(timestamp), condition)][
condition==1L, duration := as.numeric(timestamp[.N] - timestamp[1L], units='secs'), g]
unique(DT, by="g")[condition==1L & duration > 0, .(Duration=sum(duration)), .(id, date=as.IDate(timestamp))]
Альтернативный подход:
DT[, g := rleid(id, as.IDate(timestamp), condition)][
condition==1L, .(id=id[1L], date=as.IDate(timestamp)[1L],
dft=as.numeric(timestamp[.N] - timestamp[1L], units='secs')), g][
dft > 0, .(Duration==sum(dft)), .(id, date)]
вывод:
id date Duration
1: 1 2020-01-01 21155
2: 1 2020-01-02 4097
данные:
library(data.table)
DT <- fread("id,timestamp,condition
1,2020-01-01 10:10:13,0
1,2020-01-01 10:11:23,1
1,2020-01-01 10:14:45,1
1,2020-01-01 11:23:02,1
1,2020-01-01 11:33:14,1
1,2020-01-01 16:10:13,0
1,2020-01-01 18:34:12,1
1,2020-01-01 20:10:33,1
1,2020-01-01 23:04:56,1
1,2020-01-02 10:14:45,1
1,2020-01-02 11:23:02,1
1,2020-01-02 11:33:14,0
1,2020-01-02 16:10:13,0")
DT[, timestamp := as.POSIXct(timestamp, format="%Y-%m-%d %T")]