R readr::read_csv()读取全以Inf开头字符串时误判为数值Inf问题
问题原因
该问题是旧版本readr包类型推断模块的已知缺陷:其默认的数值解析逻辑采用宽松前缀匹配规则,会将所有以Inf开头的字符串识别为数值型无穷值Inf,当某列所有内容都符合该匹配规则时,就会被错误推断为数值类型;若列中存在不符合数值匹配规则的内容,类型推断会自动回退为字符类型,与你观测到的现象完全一致。
基础R的read.csv采用严格全字符串匹配的类型推断逻辑,仅当整个字符串可被转换为数值时才会判定为数值类型,因此不会出现该类误判。
无需手动指定列类型的解决方案
方案1:自定义locale禁用Inf/NaN自动识别(无需升级包)
通过readr的locale参数修改数值解析的特殊值匹配规则,直接清空Inf、NaN的识别关键词,即可避免前缀误判,该规则全局生效无需提前知晓列的结构:
# 定义禁用Inf、NaN自动识别的locale配置 custom_locale <- locale(inf = "", nan = "") # 读取时传入该配置即可 read_csv(file = "test_1.csv", locale = custom_locale)
方案2:升级readr到2.0.0及以上版本
该前缀匹配bug在readr 2.0.0版本后已被官方修复,新版本的数值解析器仅会严格匹配完整的Inf、inf、infinity字符串,不会再对仅前缀匹配的其他字符串做误判,升级后使用默认参数读取即可得到正确的字符类型列。
可选优化:调整类型推断扫描行数
如果同时存在其他列类型推断不准的问题,可以搭配guess_max = Inf参数,让readr扫描全表所有行后再做类型推断,进一步提升推断准确率:
read_csv(file = "test_1.csv", locale = custom_locale, guess_max = Inf)
内容的提问来源于stack exchange,提问作者sdevine188
相关产品推荐
相关产品推荐

