在 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_date
和 birthdate
之间差异的新列对于该行:
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
背景
我有一个 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_date
和 birthdate
之间差异的新列对于该行:
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