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

时间:2019-05-28 12:19:56

标签: r csv parsing na readr

由于read_csv在读取简单干净的csv文件时用NA替换了内容而弄乱了我的数据,这让我感到非常头痛。

我正在遍历多个大型csv文件,这些文件总计达数百万个观察值。一些列包含一些变量的一些NA。

在读取前1000次x观测值的某个列中包含NA的csv时,read_csv将使用NA填充整个列,因此,数据将丢失,无法进行进一步的操作。

显示警告消息“警告:x解析失败”,但是当我读取多个文件时,无法逐个检查该文件。尽管如此,我仍然不知道针对自动解决问题的自动修复程序,该修复程序还带有问题(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?

1 个答案:

答案 0 :(得分:0)

感谢MrFlick对我的问题给予答复:

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

guess_max = Inf也解决了这个问题,但是read_csv的速度优势似乎已经丧失。