Разница во времени, когда группа меняется в г - PullRequest
0 голосов
/ 06 сентября 2018

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

Site<-c(1,1,1,2,2,3,3,2,1,2)
start_date <- as.Date('2015-01-01')  
end_date <- as.Date('2015-12-30')   
set.seed(1990)
DetTime<-as.Date(sample( as.numeric(start_date): as.numeric(end_date), 10, 
                replace = T), 
        origin = '1970-01-01')
df<-data.frame(Site,DetTime=sort(DetTime))

Фрейм данных выглядит следующим образом:

      Site    DetTime
1     1 2015-01-15
2     1 2015-02-22
3     1 2015-03-04
4     2 2015-03-18
5     2 2015-03-23
6     3 2015-04-22
7     3 2015-05-12
8     2 2015-07-18
9     1 2015-08-05
10    2 2015-10-22

Я хочу разницу во времени, когда сайты меняются, а не просто агрегируются по сайтам. Мне нужна разница во времени от первого времени обнаружения на сайте до первого времени обнаружения на следующем сайте (не последнее обнаружение на исходном сайте).

Выполнение этого вручную для примера будет выглядеть так:

difftime(df[4,2],df[1,2]) # total is 62 days in section 1
difftime(df[6,2],df[4,2]) # total is 35 days in section 2
difftime(df[8,2],df[6,2]) # total is 87 days in section 3
difftime(df[9,2],df[8,2]) # total is 18 days in section 2
difftime(df[10,2],df[9,2]) # total is 78 days in section 1

Тогда я бы хотел взять сумму для каждого раздела.

1 Ответ

0 голосов
/ 06 сентября 2018

Один подход с data.table:

# convert to datatable
library(data.table)
setDT(df)

# keep only first row by Site, create lag, take difference
df2 <- df[ , .(DetTime = min(DetTime)), by=rleid(Site)]
df2[ , next_start := shift(DetTime, type="lead")]
df2[ , total_time := next_start - DetTime]

Результат:

> df2

   rleid    DetTime next_start total_time
1:     1 2015-01-15 2015-03-18    62 days
2:     2 2015-03-18 2015-04-22    35 days
3:     3 2015-04-22 2015-07-18    87 days
4:     4 2015-07-18 2015-08-05    18 days
5:     5 2015-08-05 2015-10-22    78 days
6:     6 2015-10-22       <NA>    NA days
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...