data.table 1.11.0版本fread处理带引号字符列的问题咨询
解决data.table 1.11.0中fread识别带引号字符列na.strings的问题
我之前也踩过这个坑!在data.table 1.11.0版本里,当你的CSV文件是通过fwrite(..., quote=TRUE)模拟write.csv行为,或者直接用write.csv生成时,fread确实会对带引号字符列里的NA值识别出错。咱们来一步步搞定它:
先复现问题,明确场景
首先用代码还原你遇到的情况:
library(data.table) # 创建包含NA的测试数据表 DT <- data.table(id = 1:3, char_col = c("a", NA, "b")) # 用quote=TRUE写入文件(模拟write.csv) fwrite(DT, "quoted_na_test.csv", quote = TRUE) # 或者直接用write.csv生成文件 write.csv(DT, "writecsv_na_test.csv", row.names = FALSE) # 用默认fread读取,会发现问题 fread("quoted_na_test.csv") # 此时char_col里的NA会被当成字符串"NA",而不是真正的缺失值
解决方案:显式指定na.strings
你需要在fread里明确指定na.strings参数,把带引号的"NA"也纳入识别范围:
# 方式1:同时指定不带引号和带引号的NA fread("quoted_na_test.csv", na.strings = c("NA", "\"NA\"")) # 方式2:用正则表达式匹配带/不带引号的NA,更简洁 fread("quoted_na_test.csv", na.strings = "^\"?NA\"?$")
这样就能把带引号的"NA"字符串正确识别为R里的NA缺失值了。
问题原因说明
在data.table 1.11.0的fread更新中,默认的na.strings处理逻辑没有考虑到引号包裹的NA字符串。当用quote=TRUE或write.csv写入时,NA值会被写成"NA"(带双引号),但默认的na.strings = "NA"只会匹配不带引号的NA,所以带引号的就被当成普通字符保留了。而默认的fwrite(DT)(不指定quote参数)会把NA写成不带引号的NA,所以fread能正常识别,这也符合官方NEWS文档的描述。
另外,如果你不想每次都手动设置参数,最彻底的办法是升级到data.table 1.12.0及以后的版本——后续版本已经修复了这个引号与na.strings的兼容问题,不用额外配置就能正确识别了。
内容的提问来源于stack exchange,提问作者p-gw
相关产品推荐
相关产品推荐

