You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自动化生成人员‘事件发生时年龄’变量的R语言实现方案

解决方案:自动生成事件发生时的年龄列

核心思路

利用dplyr的across()函数批量处理所有事件日期列,结合lubridate实现年龄计算,无需硬编码列名,适配后续新增的事件类型。

步骤实现

  1. 定义通用年龄计算函数
    封装年龄计算逻辑,自动处理NA值:
calculate_age <- function(birth_date, event_date) {
  if_else(is.na(event_date), NA_integer_,
          year(as.period(interval(start = birth_date, end = event_date))))
}
  1. 批量生成年龄列
    使用across()匹配所有事件日期列(这里以dateEventType前缀为例,也可通过排除PersonID和dateBirth实现更通用的匹配),自动生成对应年龄列:
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)

# 批量生成年龄列
data_with_age <- data %>%
  mutate(across(starts_with("dateEventType"), 
                ~calculate_age(dateBirth, .x),
                .names = "{sub('date', 'age', .col)}"))

关键细节说明

  • 列选择逻辑:starts_with("dateEventType")精准匹配所有事件日期列;如果事件列命名无固定前缀,可改用-c(PersonID, dateBirth)排除非事件列,适配更灵活的场景
  • 自动命名:.names = "{sub('date', 'age', .col)}"将原列名中的date替换为age,比如dateEventType1生成ageEventType1,规则可自定义
  • NA处理:calculate_age函数中用if_else保留原事件日期的NA值,避免无效计算
  • 扩展性:新增事件日期列时,无需修改代码,across()会自动识别并处理

验证结果

打印处理后的数据,查看生成的年龄列:

print(data_with_age)

内容的提问来源于stack exchange,提问作者Klaus Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:01:00