在 R 中,read_csv() 解析失败:将整数转换为 NA
In R, read_csv() parsing failures: Converting integers into NA's
我在使用 read_csv() 和 read.csv() 将 CSV 文件导入 R 时遇到了一个问题。我的文件包含 170 万行和其中的 78 variables.Most变量是整数。
当我使用 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() 时。它有效 returns 2946793000。
有人能告诉我为什么这两个函数在这里表现不同吗?
这些数字太大,一个整数都装不下。
.Machine$integer.max
[1] 2147483647
正如其他人所提到的,read_csv 将使用前 1000 行来猜测您的列类型。听起来您的数据的前 1000 行是整数,因此它会按原样读取所有数据。然后它在您的数据中遇到整数 class 无法处理的大整数。如果在第 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,有关于如何将 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
我在使用 read_csv() 和 read.csv() 将 CSV 文件导入 R 时遇到了一个问题。我的文件包含 170 万行和其中的 78 variables.Most变量是整数。 当我使用 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() 时。它有效 returns 2946793000。 有人能告诉我为什么这两个函数在这里表现不同吗?
这些数字太大,一个整数都装不下。
.Machine$integer.max
[1] 2147483647
正如其他人所提到的,read_csv 将使用前 1000 行来猜测您的列类型。听起来您的数据的前 1000 行是整数,因此它会按原样读取所有数据。然后它在您的数据中遇到整数 class 无法处理的大整数。如果在第 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,有关于如何将 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