2012-10-10 67 views
13

我在若干案件中看出,雖然read.table()是無法讀取製表符分隔的文件(例如微陣列的註釋表)返回以下錯誤:read.csv函數read.table與

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
line xxx did not have yyy elements 

read.csv()完美地在同一個文件中完美無誤地工作。我認爲read.csv()的速度也高於read.table()

甚至更​​多:read.table()正在閱讀我的一個文件非常瘋狂。它會在讀取第100行時出現此錯誤,但是當我在同一個文件的頭部之後複製並粘貼第90行到第110行時,它仍會使行100 + 21(在開始時複製新行)出錯。如果該行出現任何問題,爲什麼不在開始時讀取粘貼的行時報告錯誤?我確認read.csv()讀取的文件沒有錯誤。

你知道爲什麼read.table()無法讀取與read.csv()相同的文件嗎?在任何情況下,是否有任何理由使用read.table()

+1

又讀內存使用情況下'read.table()'的幫助頁面爲什麼它對於大文件可能顯得很慢。 – Chase

+1

我們無法回答您的(更新)問題,但沒有可重複的示例。最常見的讀取問題是(1)未檢測到註釋字符,(2)不匹配的引號,(3)當fill = TRUE時,文件的前5行後每行的字段數發生變化。因爲'read.csv'和'read.table'對'comment','quote'和'fill'有不同的默認值,所以這些都可能是問題。 –

+1

PS有8個'comment' /'quote' /'fill'的組合:你可以嘗試所有這些組合,看看結果如何不同 - 這可能會導致你的答案。 'count.fields()'也可以用於診斷。 –

回答

26

read.csv圍繞read.table是一個相當薄的包裝;如果您無法通過向read.table提供正確的參數來完全複製read.csv的行爲,我會非常驚訝。但是,其中一些參數(如處理引號或註釋字符的方式)可能會改變函數的速度和行爲。

特別,這是read.csv定義:

function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) { 
    read.table(file = file, header = header, sep = sep, quote = quote, 
     dec = dec, fill = fill, comment.char = comment.char, ...) 
} 

這樣說,它只是read.table與一組特定的選項。

正如@Chase在下面的評論中指出,爲read.table()幫助頁面說一樣多Details下:

read.csv and read.csv2 are identical to read.table except for the defaults. They are intended for reading ‘comma separated value’ files (‘.csv’) or (read.csv2) the variant used in countries that use a comma as decimal point and a semicolon as field separator.

+6

好的答案 - 我只是補充說,'read.table()'的幫助頁面同樣詳細說明了'read.csv和read.csv2與read.table完全相同,除了默認值。它們用於讀取'逗號分隔值'文件('.csv')或(read.csv2),該國家使用逗號作爲小數點和分號作爲字段分隔符。所以對於OP來說 - 是的,當你的數據與'read.csv'的默認值不匹配時,你會希望'read.table' – Chase

+0

剛剛更新了問題 – Ali

8

不要使用read.table閱讀製表符分隔的文件,使用read.delim。 (這僅僅是圍繞read.table瘦包裝,但它設置的選項爲適當的值)

0

read_table()做失敗的某個選項卡上的sep「編輯文件和設置sep='\s+'可能有助於假設項目在表中已經沒有空間