2013-07-18 15 views
0

我有一些有問題的sqldf列的CSV文件,導致一些數字列被歸類爲字符。我怎麼才能指定這些列的類,而不是每列?有很多列,我不一定想要爲它們指定類。如何在sqldf file.format中只指定一些colClasses?

這些問題列中的大部分數據都是零,所以當它們是數字(或實數)數據類型時,sqldf會將它們讀取爲整數。請注意,read.csv正確地分配類。 我不夠聰明,生成具有正確的性質(第50個值爲零,則值說,在第51行1.45)合適的數據集,但這裏是一個例子調用加載數據:

df <- read.csv.sql("data.dat", sql="select * from file", 
        file.format=list(colClasses=c("attr4"="numeric"))) 

返回此錯誤:

Error in sqldf(sql, envir = p, file.format = file.format, dbname = dbname, : 
    formal argument "file.format" matched by multiple actual arguments 

我可以以某種方式使用函數read.table另一個電話摸出數據類型? 我可以按字符讀取所有列,然後將某些字符轉換爲數字嗎?有一小部分是字符,並且指定這些數字比所有數字列更容易。我想出了這個醜陋的部分解決方案,但它仍然無法與同樣的錯誤消息的最後一行:在參數nrows

df.head <- read.csv("data.dat", nrows=10) 
classes <- lapply(df.head, class) # also fails to get classes correct 
classes <- replace(classes, classes=="integer", "numeric") 
df <- read.csv.sql("data.dat", sql="select * from file", 
        file.format=list(colClasses=classes)) 

回答

2

採取在爲read.csv.sql文檔細看,具體如下:

nrows: Number of rows used to determine column types. It defaults to 50. Using -1 causes it to use all rows for determining column types.

查看read.csv.sqlsqldf的文檔,您會注意到的另一件事是沒有colClasses參數。如果您閱讀sqldf中的file.format文檔,您會發現file.format列表中的參數不會傳遞給read.table,而是傳遞給sqliteImportFile,它不理解R的數據類型。如果您不想修改參數nrows,則可以將整個數據框讀取爲具有字符類型,然後使用您喜歡的任何方法來確定哪個列應該是什麼類。但是,直到讀完整列時,您總是會遇到不知道整數是整數還是數字的問題。另外,如果速度問題真的在這裏遇到了問題,您可能需要考慮放棄CSV。

+0

謝謝,我愚蠢地認爲這個參數和read.csv的nrows差不多,並且已經通過了。但是,對於大文件,使用-1會爲呼叫增加一些時間。可惜我無法使用colClasses解決它。 –