我刚刚经历了一个巨大的头痛,因为在阅读简单干净的 csv 文件时,read_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?
感谢Flick先生对我的问题给出的回答评论:
read_csv
比read.csv
更快的全部原因是因为它可以对您的数据做出假设。它查看前 1000 行以猜测列类型(通过guess_max
),但如果列中没有数据,则无法猜测该列中的内容。由于您似乎知道列中应该包含的内容,因此您应该使用col_types=
参数来告诉read_csv
会发生什么,而不是猜测。请参阅?readr::cols
帮助页面,了解如何告诉read_csv
它需要知道什么。
同样guess_max = Inf
克服了这个问题,但read_csv的速度优势似乎失去了。