如何调整R中read_excel参数避免千位分隔符被误转为小数点
解决思路
避开read_excel()的自动类型识别逻辑,先将所有列以文本格式读入,再根据数值格式特征区分处理千位分隔符和正常小数点,可实现批量自动处理,无需手动修改原Excel文件。
完整实现代码
library(tidyverse) library(readxl) # 1. 读取文件时指定所有列为文本格式,避免自动识别出错 decrease_names <- list.files("4_large_decreases",pattern = ".xlsx",full.names = T) decrease_list <- sapply(decrease_names, function(file) { read_excel(file, col_types = "text") }, simplify = F) # 2. 自定义数值转换函数,区分千位分隔符和正常小数点 process_numeric_col <- function(text_col) { case_when( # 匹配格式为「数字.三位数字」的内容:原千位分隔符被误转成小数点,删除点后转数值 str_detect(text_col, "^\\d+\\.\\d{3}$") ~ as.numeric(str_remove(text_col, "\\.")), # 其余内容为正常带小数点的数值,直接转换即可 TRUE ~ as.numeric(text_col) ) } # 3. 合并数据并批量转换列 decrease <- decrease_list %>% keep(~nrow(.x) > 0) %>% bind_rows() %>% # 此处可根据实际需要调整要转换的列范围 mutate(across(c(Raised, `Avg. change`), process_numeric_col))
补充说明
如果你的千位分隔符列所有数值都是整数,也可以用更简单的逻辑处理:读入为数值后判断是否存在三位小数,直接乘1000还原:
mutate(Raised = ifelse(Raised * 1000 == floor(Raised * 1000) & Raised != floor(Raised), Raised * 1000, Raised))
该方案适配你给出的示例格式,如果后续数值规则有变化,调整str_detect()的匹配规则即可。
内容的提问来源于stack exchange,提问作者MVDG08
相关产品推荐
相关产品推荐

