在R中,read_csv()解析失败:将整数转换成NA's

问题描述:

当我使用read_csv()和read.csv()将CSV文件导入到R时,我遇到了一个问题。我的文件包含170万行和78个变量。大部分变量都是整数。 当我使用read_csv()时,一些单元格(整数)被转换为NA,我得到以下警告。但是,这些单元格也是整数,所以我不知道它为什么会出错。在R中,read_csv()解析失败:将整数转换成NA's

10487 parsing failures. 
row col expected  actual            
3507 X27 an integer 2946793000 
3507 X46 an integer 5246675000 
3508 X8 an integer 11599000000 
3508 X23 an integer 2185000000 
3508 X26 an integer 2185000000. 

当我访问df [3507,27]时,它只显示NA。此外,X27,X46和X8都是整数,所以我不明白为什么该函数适用于大多数行,但不适用于这几行。

但是,当我使用read.csv()。它的工作原理和返回2946793000. 有人可以告诉我为什么这两个函数在这里有不同的表现吗?

+2

'read_csv'查看数据的第一行并猜测列的数据类型。有时候它猜错了,特别是对于海量数据集。例如,我有一个包含性别列的数据集,它的readr思想是布尔型的(所有的第一行都是“F”)。尝试读取文件的头部,直到出现第一个错误的行,并查看是否有一些字符串格式。您也可以强制它将有问题的列读为字符,然后将它们转换为数字。 –

这些数字太大而不适合整数。

.Machine$integer.max 
[1] 2147483647 
+0

...所以他们可以通过指定列类来读取它们的数字(而不是整数),或者他们可以读取它们作为字符,并使用CRAN中的一个大整数包(我不记得它们的名称,但我认为有几个)。 – joran

+1

对于大整数看[链接](https://*.com/questions/32368555/exactly-storing-large-integers) –

正如其他人所说,read_csv将使用前1000行来猜测您的列类型。这听起来像你的数据的前1000行是整数,所以它读入所有数据。然后它会遇到整数类无法处理的数据中的大整数。如果行1001中有任何非整数值,则会遇到类似的问题。一些例子:

#build text data - read_csv uses the first 1000 rows to guess column types 
csv_ok <- "column_header" 

for(t in 1:1000){ 
    csv_ok <- paste(csv_ok, t ,sep="\n") 
} 

#add a "problematic" double to row 1001: 
csv_w_dbl <- paste(csv_ok, 1000.25, sep="\n") 

#add a "problematic" integer: 
csv_w_bigint <- paste(csv_ok, .Machine$integer.max+1, sep="\n") 

#can't parse these without specifying column type 
read_csv(csv_w_dbl) 
read_csv(csv_w_bigint) 

#can parse these 
read_csv(csv_ok) #all integers 
read_csv(csv_w_dbl, col_types="d") #specify double as col type 
read_csv(csv_w_bigint, col_types="d") #specify double as col type to handle big integers 

我想你可能会遇到R和open_csv的内存问题。当你达到极限时,会发生奇怪的事情。近似你的R取决于你的整数长度。对于你的170万观察值和27列,我认为你从R的内存堆中打了10GB。在这里,https://rpubs.com/msundar/large_data_analysis,关于如何在大csv数据集中使用open.csv()有很好的建议。在R中理解记忆是一个复杂的挑战。下面是一个例子:

> library(pryr) 
> object_size(c(1L:11L)) 
88 B 
> object_size(c(1L)) 
48 B 
> object_size(c(1L, 2)) 
56 B 
> object_size(c(1L, 2, 3, 4 ,5, 6, 8)) 
104 B