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

如何在R语言中将不同单位(天/月/年)的年龄统一转换为年?

在R语言中将多单位年龄统一转换为年单位

这个需求很典型,处理带单位的字符串型数值转换,核心思路是先拆分出数字和单位,再根据单位做换算。我给你两种实用方案,你可以根据自己的习惯选择:

方案一:使用tidyverse工具链(代码更直观易读)

如果你平时习惯用dplyr和stringr这类工具,这个方案会很顺手:

# 先加载需要的包(如果没安装先运行 install.packages("tidyverse"))
library(tidyverse)

# 你的示例向量
Age <- c("33","32","44","54M","67M","34D","33D","44","77","88M","49 D")

# 转换流程
age_converted <- tibble(raw_age = Age) %>%
  # 提取年龄的数字部分
  mutate(age_num = as.numeric(str_extract(raw_age, "\\d+")),
         # 提取单位(只匹配D或M,没有则为NA)
         age_unit = str_extract(raw_age, "[DM]"),
         # 将NA替换为代表年的"Y"
         age_unit = replace_na(age_unit, "Y"),
         # 根据单位换算成年份
         age_years = case_when(
           age_unit == "Y" ~ age_num,          # 纯数字直接保留(年)
           age_unit == "M" ~ age_num / 12,     # 月转年:除以12
           age_unit == "D" ~ age_num / 365     # 天转年:除以365(近似值)
         ))

# 查看结果
print(age_converted)

关键步骤解释:

  • str_extract(raw_age, "\\d+"):从字符串里提取所有连续数字,不管数字和单位之间有没有空格(比如"49 D"也能正确提取49)
  • str_extract(raw_age, "[DM]"):只提取D或M单位,没有单位的会返回NA
  • case_when():清晰的条件分支,对应不同单位的换算规则

方案二:Base R实现(无需额外安装包)

如果不想依赖第三方包,用Base R的正则和条件判断也能实现:

# 你的示例向量
Age <- c("33","32","44","54M","67M","34D","33D","44","77","88M","49 D")

# 提取数字部分:去掉所有非数字字符
age_num <- as.numeric(gsub("[^0-9]", "", Age))

# 提取单位部分:去掉所有数字和空格,空字符串替换为"Y"
age_unit <- gsub("[0-9 ]", "", Age)
age_unit[age_unit == ""] <- "Y"

# 换算成年份
age_years <- ifelse(age_unit == "Y", age_num,
                    ifelse(age_unit == "M", age_num / 12,
                           age_num / 365))

# 组合成结果数据框
result <- data.frame(raw_age = Age, age_years = round(age_years, 2))
print(result)

补充说明:

  • 天转年用365是通用近似值,如果需要更精确的计算(比如考虑闰年),可以根据实际场景调整分母,但大多数数据分析场景下365足够
  • 如果你的数据里有其他未知单位,建议先做数据检查:table(age_unit),确认所有单位都在你的规则范围内
  • 可以用round(age_years, 2)来控制结果的小数位数,让输出更整洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:20:55