如何在R中无需辅助列过滤并统一转换数据库中的多种日期类型
无需辅助列统一转换多种日期格式
可以利用dplyr::case_when()函数,直接根据date列的特征区分三类数据,一次性完成转换,不需要依赖虚构的value列:
library(dplyr) data_a <- read.csv(text = " year,date,value 2018,43238,1 2017,43267,2 2020,7/25,3 2018,,4 2013,,5 2000,8/23,6 2000,9/21,7") data_final <- data_a %>% mutate(data_formatted = case_when( # 处理Excel导出的日期数字:匹配纯数字格式且非空的date !is.na(date) & grepl("^\\d+$", date) ~ as.Date(as.numeric(date), origin = "1899-12-30"), # 处理缺失年份的不完整日期:匹配含/的月日格式且非空的date !is.na(date) & grepl("/", date) ~ as.Date(paste0(year, "/", date)), # 处理空值或其他异常情况 TRUE ~ as.Date(NA) ))
逻辑说明
- Excel日期数字:通过
grepl("^\\d+$", date)识别纯数字格式的date,转换为数值后用as.Date()结合Excel的起始日期1899-12-30完成转换。 - 不完整日期:通过
grepl("/", date)识别月/日格式的date,拼接year列后转换为标准日期。 - 空值/缺失日期:剩余所有情况直接赋值为
NA(日期类型)。
验证结果
运行代码后,data_final$date_formatted列会得到统一的标准日期类型:
> data_final$date_formatted [1] "2018-05-30" "2017-06-28" "2020-07-25" NA NA "2000-08-23" "2000-09-21"
内容的提问来源于stack exchange,提问作者Giuseppe Petri
相关产品推荐
相关产品推荐

