如何从变量级别不同的固定起点计算小时数

How to calculate number of hours from a fixed start point that varies among levels of a variable

数据框 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

有人知道怎么做吗?

提前致谢!

你可以这样做:

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")))