R语言如何将字符型完整年龄转换为可比较的数值型年龄变量
解决R中将年龄字符串转换为小数形式数值变量的方案
核心思路
- 首先从年龄字符串中提取年、月、日三个维度的数值
- 按照统一的换算规则将月、日转换为年的小数部分,保证转换后数值的大小关系和实际年龄顺序完全一致
- 无需考虑不同月份实际天数差异,用统一平均换算规则即可满足需求
所需依赖包
需要用到stringr做字符串提取、lubridate做时间单位换算,也可以直接加载tidyverse全家桶:
library(tidyverse) library(lubridate)
示例数据构造
age <- tibble(complete_age = c("10 years 8 months 23 days", "9 years 11 months 7 days", "11 years 3 months 1 day", "8 years 6 months 12 days"))
实现代码
方案1:直接用lubridate的duration自动解析(代码最简洁)
lubridate的duration()函数可以直接识别你提供的年龄字符串格式,转换为时间长度后除以一年的时间长度即可得到小数形式的年龄:
age <- age %>% mutate( age_num = as.double(duration(complete_age)) / dyears(1), # 如需保留两位小数可以加round(2) age_num = round(age_num, 2) )
方案2:手动提取数值计算(灵活调整换算规则)
如果你想自己控制月、日的换算逻辑,比如按「月/12 + 天/365」的规则计算,可以先提取三个维度的数值再计算:
age <- age %>% mutate( # 提取年、月、日数值 year = str_extract(complete_age, "^\\d+") %>% as.numeric(), month = str_extract(complete_age, "(?<=years )\\d+") %>% as.numeric(), day = str_extract(complete_age, "(?<=months )\\d+") %>% as.numeric(), # 计算小数年龄 age_num = round(year + month/12 + day/365, 2), # 清除中间计算列 .keep = "unused" )
输出结果
两种方案输出的结果和你给出的期望示例近似,且完全保证年龄的大小顺序正确:
> age # A tibble: 4 × 2 complete_age age_num <chr> <dbl> 1 10 years 8 months 23 days 10.73 2 9 years 11 months 7 days 9.94 3 11 years 3 months 1 day 11.25 4 8 years 6 months 12 days 8.53
注:结果和示例的微小差异来自换算规则的不同,你可以根据需求调整换算逻辑(比如把天的分母改成365.25,或者月用平均30.4天换算),只要规则统一就不会影响年龄排序。
内容的提问来源于stack exchange,提问作者Ruam Pimentel
相关产品推荐
相关产品推荐

