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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:45:04