我正在尝试做一些与下面帖子中所做的非常类似的事情。使用dplyr。但是,我想避免从几分钟到几个月的转换,因为我当前数据库中日期变量的最高精度是几个月..
Calculating time difference by ID
Incident.ID.. = c(rep("INCFI0000029582",4), rep("INCFI0000029587",4))
date = c("2014-09-11", "2014-10-11", "2014-11-11", "2014-12-11", "2015-01-11", "2015-02-11", "2015-03-11", "2015-04-11")
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))))
Source: local data frame [8 x 3]
Groups: Incident.ID..
`enter code here` Incident.ID.. date.diff
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
我尝试将日期变量转换为as.Date格式并使用dplyr函数,如下所示
library(dplyr)
library(lubridate)
df %>%
group_by(Incident.ID..) %>%
mutate(diff = c(0, diff(date)))
但我得到了这个结果:
Incident.ID.. date diff
<chr> <date> <dbl>
1 INCFI0000029582 2014-09-11 0
2 INCFI0000029582 2014-10-11 30
3 INCFI0000029582 2014-11-11 31
4 INCFI0000029582 2014-12-11 30
5 INCFI0000029587 2015-01-11 31
6 INCFI0000029587 2015-02-11 31
7 INCFI0000029587 2015-03-11 28
8 INCFI0000029587 2015-04-11 31
我想看到下面显示的结果(使用每个ID的第一次遇到计算的日期差异):
Incident.ID.. date diff
<chr> <date> <dbl>
1 INCFI0000029582 2014-09-11 0
2 INCFI0000029582 2014-10-11 30
3 INCFI0000029582 2014-11-11 61
4 INCFI0000029582 2014-12-11 91
5 INCFI0000029587 2015-01-11 0
6 INCFI0000029587 2015-02-11 31
7 INCFI0000029587 2015-03-11 59
8 INCFI0000029587 2015-04-11 90
知道如何完成这项工作吗?谢谢你的帮助。
阿尔比特
答案 0 :(得分:1)
解决方案可以是在新列中获取每个ID的最小日期,然后从每个日期中减去它。
Min_date<-df%>%group_by(Incident.ID..)%>%summarise(min_date=min(date))
df<-df%>%left_join(Min_date,by="Incident.ID..")