R用read_xls读取Excel布尔列转成1899/1900日期,如何复原为Yes/No或逻辑值
解决方案
这个问题的根源是Excel中自定义单元格格式仅修改了展示效果,底层实际存储的是0/1数值,read_xls的自动类型识别逻辑误将0/1识别为Excel日期序列值,转为了对应的日期格式。你可以选择以下任意一种方案处理:
方案1:读取时直接指定列类型(优先推荐,适合大文件)
在调用read_xls时通过col_types参数手动指定目标列的类型,跳过自动识别环节:
- 若需要得到逻辑值(TRUE/FALSE),将对应列类型设为
"logical" - 若需要得到文本值("Yes"/"No"),可先设为
"numeric"后续做简单映射,或直接设为"text"后再替换
示例代码:
library(readxl) # 已知目标列名称时,用命名向量指定,其余列保持自动识别 df <- read_xls( "你的文件路径.xls", col_types = c( "列名1" = "logical", "列名2" = "logical", .default = "guess" ) )
如果列数量较多,也可以先读取前10行样本识别出符合特征的列,再批量生成列类型配置
方案2:读取完成后批量转换
如果提前无法确认哪些列属于该类型,可以先读取全量数据,再批量筛选符合特征的列做转换:
library(readxl) library(dplyr) df <- read_xls("你的文件路径.xls") # 批量转换所有值仅为1899-12-31、1900-01-01的列为逻辑值 df <- df %>% mutate( across( where(~ all(. %in% as.Date(c("1899-12-31", "1900-01-01")), na.rm = TRUE)), ~ ifelse(. == as.Date("1900-01-01"), TRUE, FALSE) ) )
如果需要输出为"Yes"/"No",仅需将ifelse的返回值替换为对应文本即可
方案3:全量读取为原始数值再映射
如果文件格式非常混乱,自动识别错漏较多,可以先把所有列读取为数值类型,再对目标列做自定义映射:
# 所有列先读取为原始数值 df <- read_xls("你的文件路径.xls", col_types = "numeric") # 对指定列做映射 df$目标列 <- ifelse(df$目标列 == 1, "Yes", "No")
内容的提问来源于stack exchange,提问作者Eddytheturtle
相关产品推荐
相关产品推荐

