【问题标题】:Using dplyr::lag to calculate days since first event使用 dplyr::lag 计算自第一个事件以来的天数
【发布时间】:2020-09-30 10:07:14
【问题描述】:

我正在尝试使用 dplyr::lag 来确定自初始事件以来每个事件已过去的天数,但我遇到了意外行为。

示例,非常简单的数据:

df <- data.frame(id = c("1", "1", "1", "1", "2", "2"),
                 date= c("4/1/2020", "4/2/2020", "4/3/2020", "4/4/2020", "4/17/2020", "4/18/2020"))

df$date <- as.Date(df$date, format = "%m/%d/%Y")

id      date
1  1  4/1/2020
2  1  4/2/2020
3  1  4/3/2020
4  1  4/4/2020
5  2 4/17/2020
6  2 4/18/2020

我希望做的是创建一个新列 days_since_first_event 计算初始事件(按 id)和每个后续日期之间的天数以及这个预期输出

df <- df %>%
group_by(id) %>%
mutate(days_since_first_event = as.numeric(date - lag(date)))

id      date days_since_first_event
1  1  4/1/2020                      0
2  1  4/2/2020                      1
3  1  4/3/2020                      2
4  1  4/4/2020                      3
5  2 4/17/2020                      0
6  2 4/18/2020                      1

但是我得到了这个输出

# A tibble: 6 x 3
# Groups:   id [2]
  id    date       days_since_first_event
  <chr> <date>                      <dbl>
1 1     2020-04-01                     NA
2 1     2020-04-02                      1
3 1     2020-04-03                      1
4 1     2020-04-04                      1
5 2     2020-04-17                     NA
6 2     2020-04-18                      1

关于我做错了什么有什么建议吗?

【问题讨论】:

  • 您可能正在寻找df %&gt;% group_by(id) %&gt;% mutate(days_since_first_event = date - first(date))

标签: r dplyr lag


【解决方案1】:

lag() 的前 n 个值获得默认值,因为您没有“旧”数据。默认值为NA。因此,您的结果中出现了NA

此外,使用延迟只会产生连续事件之间的差异。

【讨论】:

  • 明确一点,对于 id 1,滞后适用于 2020-04-01 和 2020-04-02,但不适用于 2020-04-01 和 2020-04-03,因为这些日期不是连续的吗?感谢您的澄清和解释初始值的行为。在您的回复和使用 first() 的解决方案之间,我有我的答案。
猜你喜欢
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
  • 2012-10-20
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2012-10-21
相关资源
最近更新 更多