组在r中变化的时间差

时间:2018-09-06 14:52:14

标签: r time

我想计算每个站点(从每个入口到每个出口)所花费的总时间。

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 :(得分:0)

使用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