You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:54:04