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

时间:2017-07-14 18:47:36

标签: r csv read.csv readr

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

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。 有人能告诉我为什么这两个函数在这里表现不同吗?

3 个答案:

答案 0 :(得分:1)

这些数字太大,无法放入整数。

.Machine$integer.max
[1] 2147483647

答案 1 :(得分:0)

正如其他人所提到的,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

答案 2 :(得分:0)

我认为您可能会遇到R和open_csv的内存问题。当你达到极限时,会发生奇怪的事情。近似R的摄取量取决于整数长度。对于你的170万观察和27列,我认为你在R内存堆中达到10GB。在这里,https://rpubs.com/msundar/large_data_analysis,对于如何将open.csv()与大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