在R中提取列中日期并补全缺失年份的tidyverse方案求助
解决方案
核心思路是先对提取到的日期字符串按斜杠数量区分格式,再根据给定的时间范围补全缺失的年份,最后统一转为日期格式,全程使用tidyverse向量化运算,适配大数据集处理需求:
library(tidyverse) db <- data.frame(A1 = c("review 11/18", "begins 12/4/19", "3/5/20", NA, "deadline 09/5/19", "9/3")) result <- db %>% # 提取由数字和斜杠组成的日期片段 mutate(A2_raw = str_extract(A1, "[0-9/]+")) %>% # 按格式补全年份后转标准日期 mutate(A2 = case_when( # 带年份的格式(2个斜杠)直接按规则解析 str_count(A2_raw, "/") == 2 ~ as.Date(A2_raw, "%m/%d/%y"), # 不带年份的格式(1个斜杠)根据月份补对应年份 str_count(A2_raw, "/") == 1 ~ case_when( # 月份≥9属于2019年 as.integer(str_extract(A2_raw, "^\\d+")) >= 9 ~ as.Date(paste0(A2_raw, "/19"), "%m/%d/%y"), # 月份<9属于2020年 TRUE ~ as.Date(paste0(A2_raw, "/20"), "%m/%d/%y") ) ))
运行后输出的A2列结果如下,无缺失值:
| A1 | A2_raw | A2 |
|---|---|---|
| review 11/18 | 11/18 | 2019-11-18 |
| begins 12/4/19 | 12/4/19 | 2019-12-04 |
| 3/5/20 | 3/5/20 | 2020-03-05 |
| deadline 09/5/19 | 09/5/19 | 2019-09-05 |
| 9/3 | 9/3 | 2019-09-03 |
关于as.Date格式的疑问解答
as.Date函数中指定的格式是输入解析规则,作用是告诉R传入的字符串每个位置对应的日期组件,不是输出显示格式。R内部会将日期统一存储为1970-01-01以来的天数数值,默认显示为YYYY-MM-DD格式。如果需要自定义显示样式,可以用format()函数将日期转为字符串,示例:format(A2, "%m/%d/%y")即可得到月/日/年格式的显示结果。
内容的提问来源于stack exchange,提问作者Michael Matta
相关产品推荐
相关产品推荐

