【发布时间】:2018-04-05 21:47:38
【问题描述】:
我正在尝试重新计算中等大小数据框(16000 行 100 个变量)的后续时间(以年为单位)。
此处已部分询问 Calculating time difference by ID 但这里描述的本质上是我想要做的,但我没有可用的时间唯一日期。
我想弄清楚为什么它只适用于日期。
当我运行这段代码时,它可以工作:
生成数据:
Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",4))
date = c("2014-09-25 08:39:45", "2014-09-25 08:39:48", "2014-09-25 08:40:44", "2014-10-10 23:04:00", "2014-09-25 08:33:32", "2014-09-25 08:34:41", "2014-09-25 08:35:24", "2014-10-10 23:04:00")
df = data.frame(Incident.ID..,date, stringsAsFactors = FALSE)
运行代码
library(dplyr)
library(lubridate)
df %>%
group_by(Incident.ID..) %>%
mutate(diff = c(0, diff(ymd_hms(date))))
输出
Incident.ID.. date diff
<chr> <chr> <dbl>
1 INCFI0000029582 2014-09-25 08:39:45 0.
2 INCFI0000029582 2014-09-25 08:39:48 3.
3 INCFI0000029582 2014-09-25 08:40:44 56.
4 INCFI0000029582 2014-10-10 23:04:00 1347796.
5 INCFI0000029587 2014-09-25 08:33:32 0.
6 INCFI0000029587 2014-09-25 08:34:41 69.
7 INCFI0000029587 2014-09-25 08:35:24 43.
8 INCFI0000029587 2014-10-10 23:04:00 1348116.
我的数据是 YMD 格式,所以这看起来合乎逻辑:
生成数据
Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",4))
date = c("2014-09-20", "2014-09-21", "2014-09-22", "2014-09-23", "2014-09-26", "2014-09-27", "2014-09-28", "2014-10-10")
df = data.frame(Incident.ID..,date, stringsAsFactors = FALSE)
运行代码
library(dplyr)
library(lubridate)
df %>%
group_by(Incident.ID..) %>%
mutate(diff = c(0, diff(ymd(date))))
输出
Incident.ID.. date diff
<chr> <chr> <dbl>
1 INCFI0000029582 2014-09-20 0.
2 INCFI0000029582 2014-09-21 1.
3 INCFI0000029582 2014-09-22 1.
4 INCFI0000029582 2014-09-23 1.
5 INCFI0000029587 2014-09-26 0.
6 INCFI0000029587 2014-09-27 1.
7 INCFI0000029587 2014-09-28 1.
8 INCFI0000029587 2014-10-10 12.
它现在给出后续观察之间的差异,而不是第一个 Incident.ID..
这里给出了答案:Date difference per ID with dplyr without hours, minutes or seconds 但我仍然不明白为什么使用上面这个非常相似的代码它不起作用。 (任何为什么它现在以天而不是秒来表示差异)。
当使用数据表方法时,我得到相同的结果:
padded.diff = function(x) c(0L, diff(x))
library(data.table)
setDT(df)[, date.diff := padded.diff(as.POSIXct(date)), by = Incident.ID..]
View(df)
非常欢迎对此行为的任何解释,因为它不会给出解析错误。 (这可能与posix时间有关,但我很困惑)
【问题讨论】:
-
你的第一个例子不是用
ymd_hms,也给出了后续观察的区别吗?第 3 行是第 2 行 + 56 秒,而不是第 1 行加 56 秒。diff的默认lag为 1。 -
@neilfws 你说得非常对。我没有充分检查,我认为接受的答案是正确的。也就是说,有没有更优雅的方法来做到这一点?
标签: r dplyr data.table lubridate