使用lubridate计算已用时间的累计集

使用lubridate计算已用时间的累计集,r,time,lubridate,R,Time,Lubridate,我有一个包含dateTime列的数据集。我需要计算每个唯一ID的4小时伸展的不同次数。以下是我到目前为止得到的 library(data.table) library(lubridate) # Fake data myID <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2) timeStamp1 <- c("2017-08-01 00:01:00", "2017-08-01 00:02:00", "2017-08-01 00:03:00", "2017-08

我有一个包含dateTime列的数据集。我需要计算每个唯一ID的4小时伸展的不同次数。以下是我到目前为止得到的

library(data.table)
library(lubridate)

# Fake data
myID <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)
timeStamp1 <- c("2017-08-01 00:01:00", "2017-08-01 00:02:00", "2017-08-01 00:03:00", "2017-08-01 00:04:00", 
                "2017-08-01 03:00:00", "2017-08-01 05:00:00", "2017-08-01 05:01:00", "2017-08-01 05:02:00",
               "2017-08-01 01:00:00", "2017-08-01 04:00:00", "2017-08-01 04:59:00", "2017-08-01 05:00:01", 
               "2017-08-01 08:00:00", "2017-08-01 09:01:00", "2017-08-01 13:01:00", "2017-08-01 13:02:00")
df1 <- data.frame(myID, timeStamp1)
dt1 <- setDT(df1)

# Convert to date type
dt1 <- dt1[, BTS := ymd_hms(timeStamp1)]

# Order by MMSI and then TimeStamp
dt1 <- dt1[order(myID, BTS)]

# Create lagged time
dt1 <- dt1[, l_BTS := shift(BTS), by = myID]

# Create span variable
dt1 <- dt1[, spans1 := abs(l_BTS - BTS)]

我不确定我是否理解您的意思,但如果您需要每组MyID中最早和最新时间戳之间的差异,您可以这样做:

library(tidyverse)

dt1 %>% group_by(myID) %>% 
        summarise(min = min(BTS), 
                  max = max(BTS)) %>% 
        mutate(delta = difftime(max, min, units = "hours")/4,
               transits = as.numeric(floor(difftime(max, min, units = "hours")/4)))

# A tibble: 2 x 5
  myID  min                  max                  delta            transits
 <dbl>  <dttm>               <dttm>               <time>           <dbl>              
     1  2017-08-01 00:01:00  2017-08-01 05:02:00  1.25416666666667 1                   
     2  2017-08-01 01:00:00  2017-08-01 13:02:00  3.00833333333333 3  
库(tidyverse)
dt1%>%分组依据(myID)%>%
总结(最小值=最小值(BTS),
最大值=最大值(基站))%>%
变异(增量=差异时间(最大、最小、单位=“小时”)/4,
传输=数值形式(地板(difftime(max,min,units=“hours”)/4))
#一个tibble:2x5
myID最小最大增量传输
1  2017-08-01 00:01:00  2017-08-01 05:02:00  1.25416666666667 1                   
2  2017-08-01 01:00:00  2017-08-01 13:02:00  3.00833333333333 3  

我不确定是否理解您的意思,但是如果您需要在每组MyID中区分最早和最新的时间戳,您可以这样做:

library(tidyverse)

dt1 %>% group_by(myID) %>% 
        summarise(min = min(BTS), 
                  max = max(BTS)) %>% 
        mutate(delta = difftime(max, min, units = "hours")/4,
               transits = as.numeric(floor(difftime(max, min, units = "hours")/4)))

# A tibble: 2 x 5
  myID  min                  max                  delta            transits
 <dbl>  <dttm>               <dttm>               <time>           <dbl>              
     1  2017-08-01 00:01:00  2017-08-01 05:02:00  1.25416666666667 1                   
     2  2017-08-01 01:00:00  2017-08-01 13:02:00  3.00833333333333 3  
库(tidyverse)
dt1%>%分组依据(myID)%>%
总结(最小值=最小值(BTS),
最大值=最大值(基站))%>%
变异(增量=差异时间(最大、最小、单位=“小时”)/4,
传输=数值形式(地板(difftime(max,min,units=“hours”)/4))
#一个tibble:2x5
myID最小最大增量传输
1  2017-08-01 00:01:00  2017-08-01 05:02:00  1.25416666666667 1                   
2  2017-08-01 01:00:00  2017-08-01 13:02:00  3.00833333333333 3  

我不明白您所说的“…每个唯一ID的4小时长度的不同数量”是什么意思。您指的是每个myID中最小和最大时间戳之间的4小时块数吗?是的,为了澄清这些是船舶数据。我需要数一数每艘飞船(唯一ID)的4小时封锁次数。。。所以,如果一个唯一的ID有一天24小时的数据,我需要将其计算为6个“传输”(24小时/4小时)。那么,我们如何处理分数呢?如果一艘船在海上航行了4小时10分钟,你想把结果算作“1次运输”还是“2次运输”?我认为四舍五入是正确的处理方法。。。因此,4小时10分钟=1次传输。我用floor()函数更新了答案,以获得每个myID的传输次数。我不明白您所说的“…每个唯一ID的4小时拉伸的不同次数”是什么意思。您指的是每个myID中最小和最大时间戳之间的4小时块数吗?是的,为了澄清这些问题,请参阅船舶数据。我需要数一数每艘飞船(唯一ID)的4小时封锁次数。。。所以,如果一个唯一的ID有一天24小时的数据,我需要将其计算为6个“传输”(24小时/4小时)。那么,我们如何处理分数呢?如果一艘船在海上航行了4小时10分钟,你想把结果算作“1次运输”还是“2次运输”?我认为四舍五入是正确的处理方法。。。所以4小时10分钟=1次中转。我用floor()函数更新了答案,以获得每个myID的中转次数。这就做到了!我决定去掉地板()并保留小数以保证精度。这就成功了!我决定去掉地板()并保留小数以保证精度。