每个ID与dplyr的日期差异,没有小时,分钟或秒

时间:2017-04-07 18:24:41

标签: r

我正在尝试做一些与下面帖子中所做的非常类似的事情。使用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

知道如何完成这项工作吗?谢谢你的帮助。

阿尔比特

1 个答案:

答案 0 :(得分:1)

解决方案可以是在新列中获取每个ID的最小日期,然后从每个日期中减去它。

Min_date<-df%>%group_by(Incident.ID..)%>%summarise(min_date=min(date))

df<-df%>%left_join(Min_date,by="Incident.ID..")