2014-04-04 90 views
1

我試圖使用ff包將大型(370萬行,180列)數據集讀入R中。數據集中有幾種數據類型 - 因子,邏輯和數字。使用read.csv.ffdf()會拋出一個錯誤

問題是在讀數值變量時。例如,我的專欄之一是:

TotalBeforeTax 
126.9 
88.0 
124.5 
90.9 
... 

當我嘗試在讀取數據時,被拋出了以下錯誤:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    scan() expected 'a real', got '"126.90000"' 

我想聲明的類integer(它已經被聲明爲numeric )使用colClasses的說法,但無濟於事。我也試着將其更改爲a real(不管是應該的意思),並開始讀取數據,但在某些時候拋出:

Error in methods::as(data[[i]], colClasses[i]) : 
    no method or default for coercing 「character」 to 「a real」 

(我的猜測是,因爲它遇到一個NA並沒有按我不知道該怎麼處理它。)

有趣的是,如果我將該列聲明爲factor,則所有內容都會很好地讀取。

什麼給?

+0

另請參見http://stackoverflow.com/questions/22357396/ff-in-r-no-applicable-method-for-recodelevels – jwijffels

回答

2

好的,所以我設法解決這個使用原始的解決方法。首先,使用csv文件分割器應用程序分割.csv文件。然後,執行以下代碼:

## First, set the folder where the split .csv files are. Set the file names. 

sourceDir <- "split_files_folder" 
sourceFile <- paste(sourceDir,"common_name_of_split_files", sep = "/") 

## Now set the number of split pieces. 

pieces <- "some_number" 

## Set the destination folder for the tab-delimited text files. 
## Set the output file name. 

destDir <- "destination_folder" 
destFile <- paste(paste(destDir, "datafile", sep = "/"), "txt", sep = ".") 

## Now, initialize the loop. 

for (i in 1:pieces) 
{ 
    temp <- read.csv(file = paste(paste(sourceFile, i, sep = "_"), "csv", sep = ".")) 
    if (i == 1) 
    { 
    write.table(temp, file = destFile, quote = FALSE, sep = "\t", row.names = FALSE, col.names = TRUE) 
    } 
    else 
    { 
    write.table(temp, file = destFile, append = TRUE, quote = FALSE, sep = "\t", row.names = FALSE, col.names = FALSE) 
    } 
} 

瞧!你有一個巨大的製表符分隔的文本文件!

+0

感謝您的回答,@neuron。爲了提高循環的速度,我建議使用data.table包中的fread()而不是read.csv。函數fread可能是讀取數據集的最快方法,如這些基準https://rpubs.com/dpastoor/benchmark-nmread和 –

0

這個問題似乎是數126.9000通過報價」所包圍。 因此,也許你應該先得到變量字符;其次去掉所有不需要的字符,最後的變量轉換爲數值。

+0

我認爲,以及當我使用普通的'read.csv'函數讀入,例如,前幾千行,它的作用就像一個魅力。另外,我不確定我是否可以按照常規方式更改「ff」數據框中的列類型。 – neuron

+0

@ssantic前段時間在r-devel列表上有關於這個問題的討論:https://stat.ethz.ch/pipermail/r-devel/2013-September/067605.html。並不是說有一個解決方案在那裏... –

1

方案1

你可以從ffbase嘗試軟件包laf_to_ffdf喜歡的東西:

library(LaF) 
library(ffbase) 

con <- laf_open_csv("yourcsvfile.csv", 
    column_names = [as character vector with column names], 
    column_types = [a character vector with colClasses], 
    dec=".", sep=",", skip=1) 

ffdf <- laf_to_ffdf(con) 

或者,如果要自動檢測類型:

library(LaF) 
library(ffbase) 

m <- detect_dm_csv("yourcsvfile.csv") 
con <- laf_open(m) 
ffdf <- laf_to_ffdf(con) 

解決方案2

使用列類character對於違規列和transFUN說法read.csv.ffdf鑄列數字:

ffdf <- read.csv.ffdf([your regular arguments], transFUN = function(d) { 
    d$offendingcolumn <- as.numeric(d$offendingcolumn) 
    d 
}) 
+0

我試過解決方案2.不幸的是,閱讀功能不支持字符(你可以檢查'.vimplemented'),並引發錯誤。我嘗試將它們加載爲因子,並用'transFUN'將它們轉換爲數字,但這給出了錯誤的值。 – neuron

+0

所以,我設法解決它使用原始的解決方法。我使用了一個csv分離器應用程序將文件分解爲每個50,000行可管理的塊。然後,我編寫了一個R腳本來加載一個塊,然後將其導出爲製表符分隔的文本文件,然後加載下一個塊,將其導出並將輸出附加到已生成的文本文件中,依此類推。加載數值或整數值時,'read.delim.ffdf'函數不會引起任何問題。 – neuron

+0

@ssantic太糟糕了,第二個解決方案無法正常工作。這可能與'read.csv.ffdf'在colClasses更改時不喜歡它有關。第一個(可能的)解決方案? –

相關問題