将字符型日期转换为日期格式,避免转换后出现NA值
解决混合格式日期转换的问题
你的问题出在直接把所有值转成numeric时,字符串格式的日期会被强制转成NA。得区分两种格式分别处理:一种是Excel的数字日期,另一种是日-月-年格式的字符串日期。
先看你的数据,目标列是Last prescription/or progression time (if progressed),先简化列名方便操作:
# 重命名列(可选,方便后续代码书写) colnames(sg2)[1] <- "date_col"
方法一:Base R 实现
用ifelse判断每个值是否能转成数字,分别处理:
sg2$date_col <- ifelse( # 判断是否为数字格式的日期(抑制转换警告,非数字会返回NA) suppressWarnings(!is.na(as.numeric(sg2$date_col))), # 数字格式转日期(Excel标准原点为1899-12-30) as.Date(as.numeric(sg2$date_col), origin = "1899-12-30"), # 字符串格式转日期,匹配日-月-年的格式 as.Date(sg2$date_col, format = "%d-%m-%Y") )
方法二:dplyr + lubridate 实现(更简洁)
用case_when分情况判断,结合lubridate的dmy函数自动解析日-月-年格式:
library(dplyr) library(lubridate) sg2 <- sg2 %>% mutate( date_col = case_when( # 匹配纯数字的Excel日期字符串 str_detect(date_col, "^\\d+$") ~ as.Date(as.numeric(date_col), origin = "1899-12-30"), # 其他情况按日-月-年解析 TRUE ~ dmy(date_col) ) )
验证转换结果:
sg2$date_col # 输出示例: # [1] "2021-11-23" "2022-09-28" "2023-01-01" "2023-03-01" "2023-05-23"
注意点
- 若转换结果偏差,可尝试将日期原点改为
1900-01-01(部分Excel版本的日期基准不同); - 若存在其他格式的日期,需在判断逻辑中补充对应的转换规则。
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

