在 R 中,使用两个日期列来计算 ID 在第一次事件中的平均年龄

In R, use two date columns to calculate the average age of ID's at first event

背景

我有一个 R 数据框,d:

d <- data.frame(ID = c("a","a","b","b", "c","c","c"),
                birthdate = as.Date(c("1980-01-01","1980-01-01","2000-12-23","2000-12-23","1949-03-14","1949-03-14","1949-03-14")),
                event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2013-04-07","2014-07-14")),
                stringsAsFactors=FALSE)

它由一个 ID 代码和两个日期组成:一个 birthdate 和一个 event_date。每个人的生日都是一致的,但每个人都有多个事件,所有这些事件都发生在不同的日期。

问题

我正在尝试计算 d 中人们(ID 秒)在第一次活动 中的平均年龄。换句话说,我想让 R 通过从他们的 birthdate 中减去每个 ID 的第一个事件来计算“第一个事件的年龄”,然后将它们相加并除以 n(在本例中为 3)。

答案(如果我这么晚还算不算太远)应该是~35.3岁.

我试过的

我不太熟悉 R 中的日期工作,所以我只是改变了一个计算 event_datebirthdate 之间差异的新列对于该行:

d <- d %>% 
  mutate(date_difference = (event_date-birthdate)/365)

但我离我的总结计算还有一段距离。我主要是想知道如何告诉 R 找到每个 ID 第一个 日期差异。 (更不用说除以 365 得到正确的年份,但在结果 df 中它们仍然被标记为“天”。)

您可以使用此代码:

d <- d %>%
  group_by(ID) %>%
  arrange(event_date) %>%
  slice(1) %>%
  mutate(date_difference = as.numeric((event_date-birthdate)/365)) %>%
  ungroup() %>%
  mutate(average_age = mean(date_difference))

输出:

# A tibble: 3 × 5
  ID    birthdate  event_date date_difference average_age
  <chr> <date>     <date>               <dbl>       <dbl>
1 a     1980-01-01 2011-01-01            31.0        35.4
2 b     2000-12-23 2011-12-23            11.0        35.4
3 c     1949-03-14 2013-03-14            64.0        35.4

作为除以 365 的替代方法,您可以使用 lubridate::time_length 函数。它以不同的时间单位(秒、分钟、天、年)计算时间段的长度。

library("tidyverse")

dat <- data.frame(
  ID = c("a", "a", "b", "b", "c", "c", "c"),
  birthdate = as.Date(c("1980-01-01", "1980-01-01", "2000-12-23", "2000-12-23", "1949-03-14", "1949-03-14", "1949-03-14")),
  event_date = as.Date(c("2011-01-01", "2012-08-21", "2011-12-23", "2011-12-31", "2013-03-14", "2013-04-07", "2014-07-14")),
  stringsAsFactors = FALSE
)

dat_with_age <- dat %>%
  group_by(ID) %>%
  slice_min(
    event_date,
    n = 1
  ) %>%
  ungroup() %>%
  mutate(
    age_at_first_event = lubridate::time_length(event_date - birthdate, unit = "year")
  )
dat_with_age
#> # A tibble: 3 × 4
#>   ID    birthdate  event_date age_at_first_event
#>   <chr> <date>     <date>                  <dbl>
#> 1 a     1980-01-01 2011-01-01               31.0
#> 2 b     2000-12-23 2011-12-23               11.0
#> 3 c     1949-03-14 2013-03-14               64

dat_with_age %>%
  summarise(
    mean(age_at_first_event)
  )
#> # A tibble: 1 × 1
#>   `mean(age_at_first_event)`
#>                        <dbl>
#> 1                       35.3

reprex package (v2.0.1)

创建于 2022-03-11