在R中使用Arrow读取CSV时将解析失败值设为NA的方法
解决Arrow包读取CSV时解析失败值自动设为NA的问题
我需要用R的arrow包open_dataset函数读取一个约1800万行、1000列的CSV文件,且预先指定schema。但该CSV生成时存在错误,部分值不符合预设schema(例如age列应为int类型,却出现了字符串类型的姓名)。我希望将这些无法解析为整数的age值设为NA,而不是让程序抛出「CSV conversion error to int8: invalid value」的错误。目前我知道可通过CsvConvertOptions$create指定null_values来处理,但需要预先知晓错误值,这需要两次遍历数据,效率较低。请问是否有无需预先知晓错误值即可将解析失败值设为NA的方法?
示例报错代码
library(tidyverse) library(arrow) # 生成测试CSV tibble(age = c(1,2,"StackOverflow",5)) %>% write_csv("example.csv") # 读取时报错的代码 arrow::open_dataset("example.csv", format = "csv", schema = schema(age = int8()), skip = 1) %>% collect()
已知的低效处理方式
arrow::open_dataset("example.csv", format = "csv", schema = schema(age = int8()), skip = 1, convert_options = CsvConvertOptions$create(null_values = "StackOverflow")) %>% collect()
高效解决方案
你可以通过设置CsvConvertOptions的invalid_field_behavior参数为"null",无需提前知晓错误值,就能自动将所有解析失败的字段值转为NA,同时避免程序报错。
优化后的代码
library(tidyverse) library(arrow) # 读取CSV,自动将解析失败值转为NA arrow::open_dataset( "example.csv", format = "csv", schema = schema(age = int8()), skip = 1, convert_options = CsvConvertOptions$create(invalid_field_behavior = "null") ) %>% collect()
说明
这个参数会让Arrow在遇到无法转换为指定类型的值时,自动将其替换为对应类型的空值(比如int类型对应NA_integer_)。无需提前遍历数据收集错误值,一次读取即可完成处理,效率更高,非常适合大规模数据集的场景。
内容的提问来源于stack exchange,提问作者Rodrigo Zepeda
相关产品推荐
相关产品推荐

