R语言如何将字符型两位年份补全转换为四位完整年份
R语言两位字符型年份补全为四位年份的实现方案
测试样例数据
先加载依赖包、构造和问题描述一致的测试数据:
library(tidyverse) test <- tibble(rep= "John Smith", quarter= "q2", year= 19:23, ideal_year= 2019:2023) %>% mutate(year=as.character(year))
使用str_glue、paste0拼接未得到预期结果,通常是因为字段存在前后多余空格、或者拼接时触发了隐式类型转换,下面是几种可直接运行的可行方案:
方案1:直接字符串拼接(固定前缀场景首选)
先对年份字段做去空白处理,再拼接固定前缀,可根据需求选择输出字符型还是数值型:
test_res <- test %>% mutate( # 输出数值型四位年份,和示例中ideal_year格式一致 full_year = paste0("20", str_trim(year)) %>% as.integer() )
如果需要保留字符格式,去掉末尾的%>% as.integer()即可。
方案2:格式化补位(兼容个位数年份场景)
如果数据中存在单数字存储的年份(比如9代表2009),用sprintf做固定长度格式化更稳妥,不会出现209这类错误结果:
test_res <- test %>% mutate( full_year = sprintf("20%02d", as.integer(str_trim(year))) %>% as.integer() )
代码中%02d的作用是将传入的年份值统一格式化为2位长度,不足2位时自动在前面补0。
方案3:日期解析函数(适配后续时序计算场景)
如果后续需要基于年份做日期运算,可以直接用日期解析函数处理,支持自定义跨世纪的年份分界点:
library(lubridate) test_res <- test %>% mutate( full_year = year(ymd(paste0(str_trim(year), "-01-01"), cutoff_2000 = 68)) )
参数说明:
cutoff_2000 = 68是默认值,规则为00-68的两位年份解析为20xx,69-99的两位年份解析为19xx,如果你的数据年份分界规则不同,直接修改该参数值即可。
结果校验
运行以下代码,如果返回TRUE说明补全结果和预期完全一致:
all.equal(test_res$full_year, test_res$ideal_year)
内容的提问来源于stack exchange,提问作者Edmonds15
相关产品推荐
相关产品推荐

