gpt4 book ai didi

r - 使用 dplyr 铅但有一些限制

转载 作者:行者123 更新时间:2023-12-04 20:33:55 24 4
gpt4 key购买 nike

我有这个数据框、dat 和 dplyr 用于添加“NextStatTime”字段,它是 ID 结束时间之后的开始时间和“持续时间”,它是从结束时间到下一个开始时间的时间ID。

数据如下所示:

     dat = data.frame(ID= c(1,1,1,2,3,3),
NumberInSequence= c(1,3,4,1,1,2),
StartTime = as.POSIXct(c("2016-01-01 05:52:05 GMT","2016-01-01 05:52:11 GMT","2016-01-01 05:52:16 GMT","2016-01-01 05:40:05 GMT","2016-01-01 06:12:13 GMT","2016-01-01 07:12:26 GMT")) ,
EndTime = as.POSIXct(c("2016-01-01 05:52:10 GMT","2016-01-01 05:52:16 GMT","2016-01-01 05:52:30 GMT","2016-01-01 05:46:05 GMT","2016-01-01 06:12:25 GMT","2016-01-01 08:00:00 GMT") )
)

dat
dat %>% group_by(ID) %>% mutate(NextStartTime = lead(StartTime), duration = as.numeric(difftime(NextStartTime, EndTime, units = 's')))

ID NumberInSequence StartTime EndTime NextStartTime duration
<dbl> <dbl> <time> <time> <time> <dbl>
1 1 1 2016-01-01 05:52:05 2016-01-01 05:52:10 2016-01-01 05:52:11 1
2 1 3 2016-01-01 05:52:11 2016-01-01 05:52:16 2016-01-01 05:52:16 0
3 1 4 2016-01-01 05:52:16 2016-01-01 05:52:30 <NA> NA
4 2 1 2016-01-01 05:40:05 2016-01-01 05:46:05 <NA> NA
5 3 1 2016-01-01 06:12:13 2016-01-01 06:12:25 2016-01-01 07:12:26 3601
6 3 2 2016-01-01 07:12:26 2016-01-01 08:00:00 <NA> NA

这非常接近正确答案,但如果缺少 ID,它仍然会计算并且会产生误导。

例如 - 查看 ID=1,有 3 个条目的序列号为 1,3 和 4。序列中没有 #2。它缺失,因此 ID = 1 和 Number in sequence = 1 的 NextStartTime 和 Duration 应该是 NA NOT 05:52:11 和 1。

有没有办法强加这种逻辑?

谢谢你。

最佳答案

我想使用 POSIXct 留下另一种方式.您可以通过以下方式避免数字到日期的转换。如果您使用 if_else()在 dplyr 包中,它关心类。您要做的是保留POSIXct函数中的类。如果您输入 typeof(dat$StartTime) ,你会发现StartTime是双。它的类是 POSIXct。所以你要使用 NA_real_并将 NA 视为 POSIXct。请确保您提供原点和时区。就我而言,我需要将我的时区指定为“亚洲/东京”,以便或产生预期的结果。

library(dplyr)
group_by(dat, ID) %>%
mutate(NextStartTime = if_else(abs(NumberInSequence - lead(NumberInSequence)) != 1,
true = as.POSIXct(NA_real_, origin = "1970-01-01 00:00:00", tz = "Asia/Tokyo"),
false = lead(StartTime)),
Duration = difftime(NextStartTime, EndTime, unit = "s"))


# ID NumberInSequence StartTime EndTime NextStartTime Duration
# <dbl> <dbl> <dttm> <dttm> <dttm> <time>
#1 1 1 2016-01-01 05:52:05 2016-01-01 05:52:10 <NA> NA secs
#2 1 3 2016-01-01 05:52:11 2016-01-01 05:52:16 2016-01-01 05:52:16 0 secs
#3 1 4 2016-01-01 05:52:16 2016-01-01 05:52:30 <NA> NA secs
#4 2 1 2016-01-01 05:40:05 2016-01-01 05:46:05 <NA> NA secs
#5 3 1 2016-01-01 06:12:13 2016-01-01 06:12:25 2016-01-01 07:12:26 3601 secs
#6 3 2 2016-01-01 07:12:26 2016-01-01 08:00:00 <NA> NA secs

关于r - 使用 dplyr 铅但有一些限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39714029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com