r - 自动创建 person 的 "age at event"变量的过程

标签 r dplyr automation

抱歉,标题有点令人困惑,但我正在努力对我的问题提供更好、更简短的描述。 我有一个数据框,其中包含人员、他们的出生日期和多种类型的事件日期。

library(dplyr)
library(lubridate)

data <- data.frame(PersonID = c(1,1,2,3,4,4,4,5,6,6),
                   dateBirth = c('2000-12-05', '2000-12-05', '1979-06-11', '1986-11-01', '2002-05-07', '2002-05-07', '2002-05-07', '2007-09-23', '1990-01-03', '1990-01-03'),
                   dateEventType1 = c('2022-01-17', NA, '2021-07-08', NA, NA, '2015-07-12', NA, NA, NA, NA),
                   dateEventType2 = c('2022-06-28', '2022-02-05', '2022-08-14', NA, NA, '2021-01-10', NA, '2022-06-08', '2021-05-01', '2021-04-19'),
                   dateEventType3 = c( '2021-01-19', '2020-12-23', '2021-06-15', '2020-06-21', '2020-10-18', '2020-10-08', '2020-10-14', '2020-07-19', '2021-01-16', '2021-08-08')) %>%
                   mutate_at(vars(2:5), ymd)

在我的示例中,存在三种类型的事件,但实际上大约有 20 个,而且数量可能会增加,因此我不喜欢“硬编码”解决方案。有时,一行有多个事件,有时一行中只有一个事件,但每个人有多行。 我想知道每次事件发生时此人的年龄。我希望有一个函数可以查看每一列,并在其旁边放置一个“事件年龄”列。 我对 lubridate 包很满意,因此使用它和 dplyr 的解决方案将是我的首选!这是我目前使用的功能:

ageAtEvent =
  year(as.period(interval(start = dateBirth,
                          end = dateEvent)))

非常感谢大家!

最佳答案

我在数据中添加了缺少的逗号并更改为 ymd

这是一种使用自定义函数跨列变异的方法

library(dplyr)
library(lubridate)

data <- data.frame(PersonID = c(1,1,2,3,4,4,4,5,6,6),
                   dateBirth = c('2000-12-05', '2000-12-05', '1979-06-11', '1986-11-01', '2002-05-07', '2002-05-07', '2002-05-07', '2007-09-23', '1990-01-03', '1990-01-03'),
                   dateEventType1 = c('2022-01-17', NA, '2021-07-08', NA, NA, '2015-07-12', NA, NA, NA, NA),
                   dateEventType2 = c('2022-06-28', '2022-02-05', '2022-08-14', NA, NA, '2021-01-10', NA, '2022-06-08', '2021-05-01', '2021-04-19') ,
                   dateEventType3 = c( '2021-01-19', '2020-12-23', '2021-06-15', '2020-06-21', '2020-10-18', '2020-10-08', '2020-10-14', '2020-07-19', '2021-01-16', '2021-08-08')) %>%
  mutate_at(vars(3:5), ymd)

ageAtEvent <- function(x, y) {year(as.period(interval(start = x, end = y)))}

data %>% 
  mutate(across(.cols = 3:5, 
                .fns = ~ ageAtEvent(dateBirth, .x), 
                .names = "age_{.col}"))

更新以按列名称交错结果:

data %>% 
  mutate(across(.cols=3:5, .fns= ~ ageAtEvent(dateBirth, .x), .names = "{.col}_age")) %>% 
  select(1:2, sort(colnames(.)))

dplyr: order columns alphabetically in R

关于r - 自动创建 person 的 "age at event"变量的过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74863946/

相关文章:

r - 为r中的每个组创建日期序列

automation - 以编程方式将来自多个演示文稿的幻灯片合并为一个演示文稿

automation - 如何在 Coq 中自动证明实数的简单不等式?

java - 在Android中无需打开邮件应用程序即可通过应用程序发送电子邮件

r - 使用 mutate_if 和 force_tz 更改所有时间戳的时区

r - 合并数据 - fix.by(by.x, x) 出错

R 中的正则表达式 : finding exact number

r - 将数据从 Fortran 传递到 R

R:在函数内使用 dplyr。 eval(expr,envir,enclos)中的异常:未知列

r - case_when 在 dplyr R 中有多个条件