我有一个数据帧,其中包含两个时间戳,如下所示,在开始和结束时我找不到这两个时间戳的区别,但是我想要的是第二行的开始与第一行的结束之间的区别。 我的数据是
time_df <- data.frame(start=as.POSIXct(c('2020-08-23 07:40:59','2020-08-23 08:22:28','2020-08-23 08:54:46','2020-08-23 09:23:17','2020-08-24 07:39:10','2020-08-24 08:13:06','2020-09-01 10:21:04','2020-09-02 06:14:54','2020-09-02 07:44:59'))
,end=as.POSIXct(c('2020-08-23 08:15:23','2020-08-23 08:46:41','2020-08-23 09:17:05','2020-08-23 09:51:20','2020-08-24 08:09:29','2020-08-24 08:37:45','2020-09-01 10:56:41','2020-09-02 06:43:02','2020-09-02 08:08:50')))
我正在尝试
time_df$duration <- as.numeric(difftime(time_df$end,time_df$start,units ="mins"))
但是我想找到第二行的开始与第一行的结束之间的差异,且保持在数据帧的上方,我至少要保持(8:22:28-8:15:23)的差异
答案 0 :(得分:1)
您可以从start
中删除第一个值,并从end
中删除最后一个值,以便获得start
的第二个值和end
的第三个值之差start
的值和end
的第二个值,依此类推。我们在开头添加一个NA
值,以使长度等于行数。
time_df$diff <- c(NA, difftime(time_df$start[-1],
time_df$end[-nrow(time_df)], units = 'mins'))
或者,如果您使用dplyr
,则可以使用lag
来获取先前的值:
library(dplyr)
time_df %>% mutate(diff = difftime(start, lag(end), units = 'mins'))
# start end diff
#1 2020-08-23 07:40:59 2020-08-23 08:15:23 NA mins
#2 2020-08-23 08:22:28 2020-08-23 08:46:41 7.1 mins
#3 2020-08-23 08:54:46 2020-08-23 09:17:05 8.1 mins
#4 2020-08-23 09:23:17 2020-08-23 09:51:20 6.2 mins
#5 2020-08-24 07:39:10 2020-08-24 08:09:29 1307.8 mins
#6 2020-08-24 08:13:06 2020-08-24 08:37:45 3.6 mins
#7 2020-09-01 10:21:04 2020-09-01 10:56:41 11623.3 mins
#8 2020-09-02 06:14:54 2020-09-02 06:43:02 1158.2 mins
#9 2020-09-02 07:44:59 2020-09-02 08:08:50 62.0 mins
答案 1 :(得分:1)
使用rowSums
。转换end
as.numeric
以获得负号。
d <- rowSums(cbind(-as.numeric(time_df$end[-nrow(time_df)]), time_df$start[-1]))
d ## seconds
# [1] 425 485 372 78470 217 697399 69493 3717
d/60 ## minutes
# [1] 7.083333 8.083333 6.200000 1307.833333
# [5] 3.616667 11623.316667 1158.216667 61.950000