r - 自 R 中分组数据的最后一个事件以来的时间

标签 r dplyr time

我有一个数据框,其中包含一个分组变量 (ID)、一个日期和一个带有数值的事件列,其中 0 表示没有事件,>0 表示有事件。可以使用以下代码生成示例数据框:

df <- data.frame(ID = c (1, 1, 1, 1, 2, 2, 2),
                   date = as.Date(c("2014-08-03", "2014-08-04", "2014-08-07", "2014-08-10", "2015-07-01", "2015-07-03", "2015-08-01")),
                   event = c(1, 0, 3, 0, 0, 4, 0))
df
> df
  ID       date event
1  1 2014-08-03     1
2  1 2014-08-04     0
3  1 2014-08-07     3
4  1 2014-08-10     0
5  2 2015-07-01     0
6  2 2015-07-03     4
7  2 2015-08-01     0

现在,我想计算自上次事件 (>0) 发生以来耗时。在任何 ID 的第一个/多个条目不包含事件的特定情况下,应生成“NA”。我想要的输出看起来像这样:

> df
  ID       date event tae
1  1 2014-08-03     1   0
2  1 2014-08-04     0   1
3  1 2014-08-07     3   0
4  1 2014-08-10     0   3
5  2 2015-07-01     0  NA
6  2 2015-07-03     4   0
7  2 2015-08-01     0  29

我尝试了几种不同的方法。我得到的最接近的是:

library(dplyr)

df %>%
  mutate(tmpG = cumsum(c(FALSE, as.logical(diff(event))))) %>%
  group_by(ID) %>%
  mutate(tmp = c(0, diff(date)) * !event) %>%
  group_by(tmpG) %>%
  mutate(tae = cumsum(tmp)) %>%
  ungroup() %>%
  select(-c(tmp, tmpG))

# A tibble: 7 x 4
     ID date       event   tae
  <dbl> <date>     <dbl> <dbl>
1     1 2014-08-03     1     0
2     1 2014-08-04     0     1
3     1 2014-08-07     3     0
4     1 2014-08-10     0     3
5     2 2015-07-01     0     3
6     2 2015-07-03     4     0
7     2 2015-08-01     0    29

任何有关如何运行该代码(或任何其他替代方案)的建议都将不胜感激。

最佳答案

这是另一种 tidyverse 方法,它使用 fill 来继承最近的事件。

library(tidyverse)

df %>%
  group_by(ID) %>%
  mutate(last_event = if_else(event > 0, date, NA_real_)) %>%
  fill(last_event) %>%
  mutate(tae = as.numeric(date - last_event))

输出

     ID date       event last_event   tae
  <dbl> <date>     <dbl> <date>     <dbl>
1     1 2014-08-03     1 2014-08-03     0
2     1 2014-08-04     0 2014-08-03     1
3     1 2014-08-07     3 2014-08-07     0
4     1 2014-08-10     0 2014-08-07     3
5     2 2015-07-01     0 NA            NA
6     2 2015-07-03     4 2015-07-03     0
7     2 2015-08-01     0 2015-07-03    29

关于r - 自 R 中分组数据的最后一个事件以来的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71284863/

相关文章:

r - 在Linux上使用knitr设置texmaker

r - 如何使用所有软件包,设置和所有其他功能卸载R和RStudio?

r - dplyr 中的选择函数出错

android - 将 12 (PM/AM)Hour AM PM 时间中的字符串转换为 24 小时时间 android

mysql - 请求在sql db中查找时间最接近的元素

r - 在 R data_frame 中提取每个观察的因子级别?

python - 使用 rpy2 库,R 中的 For 循环比 Python 中的循环快几倍

r - 将 quosure 和 format 拼接成字符串列表

r - 从 RStudio 调用的 knitr 不保留加载包的顺序

json - 使用按钮更新用户位置并快速绘制路线