使用readxlsb和cellranger::cell_limits()读取xlsb时如何获取全部小数位
解决方案
直接修改read_xlsb的传参即可,完全兼容cellranger::cell_limits()功能,调整后的代码如下:
# install.packages(c("readxlsb", "tidyverse"), dependencies = TRUE) library(readxlsb); library(tidyverse) as_tibble( read_xlsb(path = system.file("extdata", "TestBook.xlsb", package = "readxlsb"), sheet = "Sheet3.1.1", range = cellranger::cell_limits(), # 控制数值转字符时的小数保留位数,设为16覆盖双精度浮点数最大精度 digits = 16, # 可选:提高列类型猜测的扫描行数,避免前几行文本导致数值列被误判为字符型 guess_max = 1048576) )
参数说明
你遇到的两个问题都属于read_xlsb的默认配置限制:
- 小数位丢失是因为函数默认
digits = 6,当列被识别为字符型时,列内的数值会被格式化为仅保留6位小数的字符串,修改为16即可完整读取16位以内的小数 - 数值列被识别为字符型是因为函数默认仅扫描前10行判断列类型,表头的大量文本会导致类型误判,调整
guess_max为全表最大行数(Excel最大支持1048576行)后会扫描全表判断类型,只要列内数值占比足够会自动识别为数值型。如果运行时报错不识别该参数,先更新readxlsb到最新版本即可。如果你的列内确实同时存在文本和数值,保持字符型即可,后续需要提取数值时可以用readr::parse_number()转换,同样可以拿到完整精度的数值。
内容的提问来源于stack exchange,提问作者Eric Fail
相关产品推荐
相关产品推荐

