2017-07-14 261 views
0

當我使用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」)。嘗試讀取文件的頭部,直到出現第一個錯誤的行,並查看是否有一些字符串格式。您也可以強制它將有問題的列讀爲字符,然後將它們轉換爲數字。 –

回答

1

這些數字太大而不適合整數。

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

...所以他們可以通過指定列類來讀取它們的數字(而不是整數),或者他們可以讀取它們作爲字符,並使用CRAN中的一個大整數包(我不記得它們的名稱,但我認爲有幾個)。 – joran

+1

對於大整數看[鏈接](https://stackoverflow.com/questions/32368555/exactly-storing-large-integers) –

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 
0

我想你可能會遇到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