r - 计算单个日期列的持续时间(以秒为单位),而 R 中的 group_by ID
问题描述
R有没有办法按ID分组,及时识别“中断”,将其设置为0,然后计算时间差?
例如:
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 进行分组,然后以秒为单位计算时间差,同时将时间的巨大差距设置为“0”以避免不准确的值?
这不是正确的解决方案。
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"))
结果:
ID TIME Duration
A 12/18/2019 4:45:10 AM 1 sec
A 12/18/2019 4:45:11 AM
A 12/18/2019 9:06:59 PM 0 sec
B 12/18/2019 4:14:13 AM 1 sec
B 12/18/2019 4:14:14 AM
任何帮助是极大的赞赏。我会继续研究这个。谢谢
解决方案
mdy_hms
我们使用from将“TIME”转换为 Datetime 类,按“ID”分组,通过使用(指定)获取lubridate
相邻元素之间“TIME”的差异来检查或“TIME”中的连续元素,使用add创建数字索引这也作为分组列来创建'TIME'元素之间的erence作为新列'Duration'difftime
unit
cumsum
diff
library(dplyr)
library(lubridate)
df1 %>%
mutate(TIME = mdy_hms(TIME)) %>%
group_by(ID) %>%
group_by(grp = cumsum(as.numeric(difftime(TIME,
lag(TIME, default = first(TIME)), TIME, unit = 'sec')) > 1), add = TRUE) %>%
mutate(Duration = if(n() == 1) NA_real_ else as.numeric(c(diff(TIME), 0))) %>%
ungroup %>%
select(-grp)
# A tibble: 5 x 3
# ID TIME Duration
# <chr> <dttm> <dbl>
#1 A 2019-12-18 04:45:10 1
#2 A 2019-12-18 04:45:11 0
#3 A 2019-12-18 21:06:59 NA
#4 B 2019-12-18 04:14:13 1
#5 B 2019-12-18 04:14:14 0
数据
df1 <- structure(list(ID = c("A", "A", "A", "B", "B"), TIME = c("12/18/2019 4:45:10 AM",
"12/18/2019 4:45:11 AM", "12/18/2019 9:06:59 PM", "12/18/2019 4:14:13 AM",
"12/18/2019 4:14:14 AM")), class = "data.frame", row.names = c(NA,
-5L))
推荐阅读
- visual-studio-2019 - 文件嵌套不适用于类或共享库项目
- laravel - 为什么作曲家不更新特定的包?
- typescript - 使用 io.to(user).emit() 通知特定的人
- java - JNA中基于C的嵌套数组结构翻译
- android - Google Play 游戏服务 - 排行榜,只能看到当前用户的分数
- python - flink run -py wordcount.py 导致 NullPointerException
- c# - 任务管理器中的 Python 进程数正在增加
- java - Hazelcast,在缓存中发生更改时记录
- c - 将内存分配给结构指针时出错
- angularjs - Springboot + JWT +OAuth2 + AngularJS 无状态会话