2

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

4

3 回答 3

2

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

.Machine$integer.max
[1] 2147483647
于 2017-07-14T18:59:20.433 回答
1

正如其他人所提到的, 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
于 2017-07-14T19:31:14.757 回答
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
于 2017-08-15T17:12:00.430 回答