Как рассчитать количество часов от фиксированной начальной точки, которая варьируется между уровнями переменной - PullRequest
0 голосов
/ 08 июля 2019

Фрейм данных df1 суммирует обнаружения различных людей (ID) во времени (Datetime). В качестве краткого примера:

library(lubridate)

df1<- data.frame(ID= c(1,2,1,2,1,2,1,2,1,2),
                 Datetime= ymd_hms(c("2016-08-21 00:00:00","2016-08-24 08:00:00","2016-08-23 12:00:00","2016-08-29 03:00:00","2016-08-27 23:00:00","2016-09-02 02:00:00","2016-09-01 12:00:00","2016-09-09 04:00:00","2016-09-01 12:00:00","2016-09-10 12:00:00")))

> df1
   ID            Datetime
1   1 2016-08-21 00:00:00
2   2 2016-08-24 08:00:00
3   1 2016-08-23 12:00:00
4   2 2016-08-29 03:00:00
5   1 2016-08-27 23:00:00
6   2 2016-09-02 02:00:00
7   1 2016-09-01 12:00:00
8   2 2016-09-09 04:00:00
9   1 2016-09-01 12:00:00
10  2 2016-09-10 12:00:00

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

Я бы ожидал что-то подобное (оно может содержать некоторые ошибки, так как я делал вычисления вручную):

> df1
   ID            Datetime Hours_since_begining
1   1 2016-08-21 00:00:00                    0
2   2 2016-08-24 08:00:00                    0
3   1 2016-08-23 12:00:00                   60 # Number of hours between "2016-08-21 00:00:00" (first time detected the Ind 1) and "2016-08-23 12:00:00" 
4   2 2016-08-29 03:00:00                  115 
5   1 2016-08-27 23:00:00                  167 # Number of hours between "2016-08-21 00:00:00" (first time detected the Ind 1) and "2016-08-27 23:00:00" 
6   2 2016-09-02 02:00:00                  210
7   1 2016-09-01 12:00:00                  276
8   2 2016-09-09 04:00:00                  380
9   1 2016-09-01 12:00:00                  276
10  2 2016-09-10 12:00:00                  412

Кто-нибудь знает, как это сделать?

Заранее спасибо!

1 Ответ

1 голос
/ 08 июля 2019

Вы можете сделать это:

library(tidyverse)
# first get min datetime by ID
min_datetime_id <- df1 %>% group_by(ID) %>% summarise(min_datetime=min(Datetime))
# join with df1 and compute time difference
df1 <- df1 %>% left_join(min_datetime_id) %>% mutate(Hours_since_beginning= as.numeric(difftime(Datetime, min_datetime,units="hours")))
...