有没有一种方法可以让R按ID分组,然后识别时间上的“中断”,然后计算时差?例如:
ID TIME
A 12/18/2019 4:45:10 AM
A 12/18/2019 4:45:11 AM
A 12/18/2019 9:06:59 PM
B 12/18/2019 4:14:13 AM
B 12/18/2019 4:14:14 AM
有人知道找到A的持续时间的方法吗?请注意,这不是difftime问题。我在4:45:10上午进行了某些活动,然后在4:45:11再次进行了。然后,我停止了此活动,并在晚上9:06进行了恢复。是否有代码可以准确地对ID进行分组,然后对时间进行分组,同时检测出时间上的巨大差异以避免错误的值?
这不是正确的解决方案。
diff<- data %>%
mutate(diff = difftime(as.POSIXct(Endtime, format = "%m/%d/%Y %I:%M:%S %p"),
as.POSIXct(Starttime, format = "%m/%d/%Y %I:%M:%S %p"), units = "secs"))
任何帮助是极大的赞赏。我将继续对此进行研究。谢谢
就像我上面提到的,第一件事是将日期时间转换为日期时间对象。我正在lubridate
为此。由于您希望将增量保持在某个阈值内,因此我将阈值持续时间保存为5分钟,可以根据需要进行更改。如果差异不止于此,请加以区别NA
。
我将分两步进行比较,以便您可以看到原始差异与删除长差异的差异。您可能只想一步就可以做到。
library(dplyr)
library(lubridate)
thresh <- duration(5, units = "minutes")
sample_df %>%
mutate(TIME = mdy_hms(TIME)) %>%
group_by(ID) %>%
mutate(diff1 = TIME - lag(TIME)) %>%
mutate(delta = if_else(diff1 < thresh, diff1, NA_real_))
#> # A tibble: 10 x 4
#> # Groups: ID [3]
#> ID TIME diff1 delta
#> <chr> <dttm> <drtn> <drtn>
#> 1 A 2019-12-18 04:45:10 NA secs NA secs
#> 2 A 2019-12-18 04:45:11 1 secs 1 secs
#> 3 A 2019-12-18 16:06:59 40908 secs NA secs
#> 4 A 2019-12-18 16:07:01 2 secs 2 secs
#> 5 B 2019-12-18 04:14:13 NA secs NA secs
#> 6 B 2019-12-18 04:14:14 1 secs 1 secs
#> 7 B 2019-12-18 04:14:15 1 secs 1 secs
#> 8 C 2019-12-18 04:59:49 NA secs NA secs
#> 9 C 2019-12-18 04:59:50 1 secs 1 secs
#> 10 C 2019-12-18 04:59:51 1 secs 1 secs
使用dplyr::if_else
而不是基ifelse
是方便的,因为它使用严格的类型,这有助于确保我将delta列保留为持续时间对象,而不是丢失其时间分量而只是得到一个数值,NA
而代替会发生这种情况NA_real_
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句