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_csv
比 read.csv
更快的全部原因是因为它可以对您的数据做出假设。它查看前 1000 行来猜测列类型(通过 guess_max
),但如果列中没有数据,它就无法猜测该列中的内容。由于您似乎知道列中应该包含什么,因此您应该使用 col_types=
参数来告诉 read_csv
期望什么而不是让它猜测。请参阅 ?readr::cols
帮助页面,了解如何告知 read_csv
它需要知道的内容。
也guess_max = Inf
克服了这个问题,但是read_csv的速度优势似乎失去了。
我刚刚经历了一个巨大的头痛,因为 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_csv
比 read.csv
更快的全部原因是因为它可以对您的数据做出假设。它查看前 1000 行来猜测列类型(通过 guess_max
),但如果列中没有数据,它就无法猜测该列中的内容。由于您似乎知道列中应该包含什么,因此您应该使用 col_types=
参数来告诉 read_csv
期望什么而不是让它猜测。请参阅 ?readr::cols
帮助页面,了解如何告知 read_csv
它需要知道的内容。
也guess_max = Inf
克服了这个问题,但是read_csv的速度优势似乎失去了。