read_csv (readr, R) 如果在简单干净的 csv 中的第 1000 + x 个观测值中有 NA(解析失败),则用 NA 填充整个列

read_csv (readr, R) populates entire column with NA if there are NA in the fist 1000 + x observations in a simple and clean csv (parsing failure)

我刚刚经历了一个巨大的头痛,因为 read_csv 在读取简单干净的 csv 文件时用 NA 替换内容弄乱了我的数据。

我正在迭代多个大型 csv 文件,这些文件加起来有数百万个观察值。对于某些变量,某些列包含相当多的 NA。

当读取前 1000 + x 个观察值的特定列中包含 NA 的 csv 时,read_csv 会用 NA 填充整个列,因此,数据将丢失以供进一步操作。

显示警告消息“Warning: x parsing failure”,但由于我正在读取多个文件,因此无法逐个文件检查。尽管如此,我还是不知道解析问题的自动修复也有 problems(x)

使用read.csv而不是read_csv不会导致问题,但它很慢而且我运行陷入编码问题(使用不同的编码需要太多内存来处理大文件) .

克服此错误的一个选项是向您的数据添加第一个观察结果(第一行),其中包含每列的内容,但我仍然需要先以某种方式读取文件。

请参阅下面的简化示例:

##create a dtafrane
    df <- data.frame( id = numeric(), string = character(), 
                  stringsAsFactors=FALSE)
##poluate columns
    df[1:1500,1] <- seq(1:1500)
    df[1500,2] <- "something" 
# variable string contains the first value in obs. 1500 
    df[1500,]
## check the numbers of NA in variable string
    sum(is.na(df$string))   # 1499
##write the df
    write_csv(df, "df.csv")
##read the df with read_csv and read.csv
    df_readr <- read_csv('df.csv')
    df_read_standard <- read.csv('df.csv')
##check the number of NA in variable string
    sum(is.na(df_readr$string))  #1500
    sum(is.na(df_read_standard$string))  #1499
## the read_csv files is all NA for variable string
    problems(df_readr) ##What should that tell me? How to fix it?

感谢 MrFlick 对我的问题给予解答评论:

read_csvread.csv 更快的全部原因是因为它可以对您的数据做出假设。它查看前 1000 行来猜测列类型(通过 guess_max),但如果列中没有数据,它就无法猜测该列中的内容。由于您似乎知道列中应该包含什么,因此您应该使用 col_types= 参数来告诉 read_csv 期望什么而不是让它猜测。请参阅 ?readr::cols 帮助页面,了解如何告知 read_csv 它需要知道的内容。

guess_max = Inf克服了这个问题,但是read_csv的速度优势似乎失去了。