R - 计算自多个事件类型的上一个事件以来经过的时间

Bee*_*Gee 5 time r

我有一个数据框,其中包含多种类型事件的日期.

df <- data.frame(date=as.Date(c("06/07/2000","15/09/2000","15/10/2000"
                            ,"03/01/2001","17/03/2001","23/04/2001",
                            "26/05/2001","01/06/2001",
                            "30/06/2001","02/07/2001","15/07/2001"
                            ,"21/12/2001"), "%d/%m/%Y"), 
             event_type=c(0,4,1,2,4,1,0,2,3,3,4,3))

   date                event_type
   ----------------    ----------
1  2000-07-06          0
2  2000-09-15          4
3  2000-10-15          1
4  2001-01-03          2
5  2001-03-17          4
6  2001-04-23          1
7  2001-05-26          0
8  2001-06-01          2
9  2001-06-30          3
10 2001-07-02          3
11 2001-07-15          4
12 2001-12-21          3
Run Code Online (Sandbox Code Playgroud)

我试图计算每个事件类型之间的天数,所以输出如下所示:

   date                event_type          days_since_last_event
   ----------------    ----------          ---------------------
1  2000-07-06          0                    NA
2  2000-09-15          4                    NA
3  2000-10-15          1                    NA
4  2001-01-03          2                    NA
5  2001-03-17          4                   183
6  2001-04-23          1                   190
7  2001-05-26          0                   324
8  2001-06-01          2                   149
9  2001-06-30          3                    NA
10 2001-07-02          3                     2
11 2001-07-15          4                   120
12 2001-12-21          3                   172
Run Code Online (Sandbox Code Playgroud)

我从前两篇文章的答案中受益,但未能解决我在R中的具体问题; 多种事件类型.

计算自上次事件以来经过的时间

计算自R上次事件以来的天数

以下就我所知.我无法利用最后一个事件索引来计算最后一个事件日期.

df <- cbind(df, as.vector(data.frame(count=ave(df$event_type==df$event_type,
                                           df$event_type, FUN=cumsum))))
df <- rename(df, c("count" = "last_event_index"))

   date                event_type      last_event_index
   ---------------     -------------   ----------------
1  2000-07-06          0                1
2  2000-09-15          4                1
3  2000-10-15          1                1
4  2001-01-03          2                1
5  2001-03-17          4                2
6  2001-04-23          1                2
7  2001-05-26          0                2
8  2001-06-01          2                2
9  2001-06-30          3                1
10 2001-07-02          3                2
11 2001-07-15          4                3
12 2001-12-21          3                3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 9

我们可以使用diff'event_type'来分组相邻'date'之间的差异.在这里,我使用data.table方法将'data.frame'转换为'data.table'(setDT(df)),按'event_type'分组,我们得到diff'date'.

library(data.table)
setDT(df)[,days_since_last_event :=c(NA,diff(date)) , by = event_type]
df
#          date event_type days_since_last_event
# 1: 2000-07-06          0                    NA
# 2: 2000-09-15          4                    NA
# 3: 2000-10-15          1                    NA
# 4: 2001-01-03          2                    NA
# 5: 2001-03-17          4                   183
# 6: 2001-04-23          1                   190
# 7: 2001-05-26          0                   324
# 8: 2001-06-01          2                   149
# 9: 2001-06-30          3                    NA
#10: 2001-07-02          3                     2
#11: 2001-07-15          4                   120
#12: 2001-12-21          3                   172
Run Code Online (Sandbox Code Playgroud)

或者正如@Frank在评论中提到的那样,我们也可以使用shift(从版本v1.9.5+开始)获取'date' lag(默认情况下type='lag'),并从'date'中减去.

setDT(df)[, days_since_last_event := as.numeric(date-shift(date,type="lag")), 
                                  by = event_type]
Run Code Online (Sandbox Code Playgroud)

  • 或者`日期转换(日期,类型="滞后")` (3认同)

use*_*691 5

基本的 R 版本是使用 split/lapply/rbi​​nd 来生成新列。

> do.call(rbind,
    lapply(
      split(df, df$event_type),
      function(d) {
        d$dsle <- c(NA, diff(d$date)); d
      }
    )
  )
           date event_type dsle
0.1  2000-07-06          0   NA
0.7  2001-05-26          0  324
1.3  2000-10-15          1   NA
1.6  2001-04-23          1  190
2.4  2001-01-03          2   NA
2.8  2001-06-01          2  149
3.9  2001-06-30          3   NA
3.10 2001-07-02          3    2
3.12 2001-12-21          3  172
4.2  2000-09-15          4   NA
4.5  2001-03-17          4  183
4.11 2001-07-15          4  120
Run Code Online (Sandbox Code Playgroud)

请注意,这会以与提供的顺序不同的顺序返回数据;如果您想保留该顺序,您可以按日期重新排序或保存原始索引。

上面,@akrun 已经发布了data.tables方法,并行dplyr方法也很简单:

library(dplyr)
df %>% group_by(event_type) %>% mutate(days_since_last_event=date - lag(date, 1))
Run Code Online (Sandbox Code Playgroud)

来源:本地数据框 [12 x 3] 组:event_type [5]

         date event_type days_since_last_event
       (date)      (dbl)                (dfft)
1  2000-07-06          0               NA days
2  2000-09-15          4               NA days
3  2000-10-15          1               NA days
4  2001-01-03          2               NA days
5  2001-03-17          4              183 days
6  2001-04-23          1              190 days
7  2001-05-26          0              324 days
8  2001-06-01          2              149 days
9  2001-06-30          3               NA days
10 2001-07-02          3                2 days
11 2001-07-15          4              120 days
12 2001-12-21          3              172 days
Run Code Online (Sandbox Code Playgroud)