數據導入讀取read.table函數詳解,如何讀取不規則的數據(fill=T)

函數 read.table 是讀取矩形格子狀數據最爲便利的方式。由於實際可能遇到的狀況比較多,因此預設了一些函數。這些函數調用了 read.table 但改變了它的一些默認參數。安全

注意,read.table 不是一種有效地讀大數值矩陣的方法:見下面的 scan 函數。函數

一些須要考慮到問題是:編碼

  1. 編碼問題

    若是文件中包含非-ASCII字符字段,要確保以正確的編碼方式讀取。這是在UTF-8的本地系統裏面讀取Latin-1文件的一個主要問題。此時,能夠以下處理spa

              read.table(file("file.dat", encoding="latin1"))
         

    注意,這在任何能夠呈現Latin-1名字的本地系統裏面運行。操作系統

  2. 首行問題

    咱們建議你明確地設定 header 參數。按照慣例,首行只有對應列的字段而沒有行標籤對應的字段。所以,它會比餘下的行少一個字段。(若是須要在 R 裏面看到這一行,設置 header = TRUE。)若是要讀取的文件裏面有行標籤的頭字段(多是空的),如下面的方式讀取設計

              read.table("file.dat", header = TRUE, row.names = 1)
         

    列名字能夠經過 col.names 顯式地設定;顯式設定的名字會替換首行裏面的列名字(若是存在的話)。code

  3. 分隔符問題

    一般,打開文件看一下就能夠肯定文件所使用的字段分隔符,但對於空白分割的文件,能夠選擇默認的sep = "" (它能使用任何空白符做爲分隔符,好比空格,製表符,換行符), sep = " " 或者 sep = "\t"。注意,分隔符的選擇會影響輸入的被引用的字符串。blog

    若是你有含有空字段的製表符分割的文件,必定要使用 sep = "\t"ip

  4. 引用 默認狀況下,字符串能夠被 " 或 ' 括起,而且兩種狀況下,引號內部的字符都做爲字符串的一部分。有效的引用字符(可能沒有)的設置由參數 quote 控制。對於sep = "\n",默認值改成 quote = ""

    若是沒有設定分隔字符,在被引號括起的字符串裏面,引號須要用 C格式的逃逸方式逃逸,即在引號前面直接加反斜槓 \element

    若是設定了分隔符,在被引號括起的字符串裏面,按照電子表格的習慣,把引號重複兩次以達到逃逸的效果。例如

              'One string isn''t two',"one more"
         

    能夠被下面的命令讀取

              read.table("testfile", sep = ",")
         

    這在默認分隔符的文件裏面不起做用。

  5. 缺損值 默認狀況下,文件是假定用 NA 表示缺損值,可是,這能夠經過參數 na.strings 改變。參數 na.strings 是一個能夠包括一個或多個缺損值得字符描述方式的向量。

    數值列的空字段也被看做是缺損值。

    在數值列,值 NaNInf 和 -Inf 均可以被接受的。

  6. 尾部空字段省略的行

    從一個電子表格中導出的文件一般會把拖尾的空字段(包括?塹姆指舴? 忽略掉。爲了讀取這樣的文件,必須設置參數 fill = TRUE

  7. 字符字段中的空白

    若是設定了分隔符,字符字段起始和收尾處的空白會做爲字段一部分看待的。爲了去掉這些空白,可使用參數 strip.white = TRUE

  8. 空白行

    默認狀況下,read.table 忽略空白行。這能夠經過設置 blank.lines.skip = FALSE 來改變。但這個參數只有在和 fill = TRUE 共同使用時纔有效。這時,多是用空白行代表規則數據中的缺損樣本。

  9. 變量的類型

    除非你採起特別的行動,read.table 將會爲數據框的每一個變量選擇一個合適的類型。若是字段沒有缺損以及不能直接轉換,它會按 logical, integernumeric 和 complex 的順序依次判斷字段類型。若是全部這些類型都失敗了,變量會轉變成因子。

    參數 colClasses 和 as.is 提供了很大的控制權。 as.is 會 抑制字符向量轉換成因子(僅僅這個功能)。 colClasses運行爲輸入中的每一個列設置須要的類型。

    注意,colClasses 和 as.is 對 列專用,而不是個變量。所以,它對行標籤列也一樣適用(若是有的話)。

  10. 註釋

    默認狀況下,read.table 用 # 做爲註釋標識字符。若是碰到該字符(除了在被引用的字符串內),該行中隨後的內容將會被忽略。只含有空白和註釋的行被看成空白行。

    若是確認數據文件中沒有註釋內容,用 comment.char = "" 會比較安全 (也可能讓速度比較快)。

  11. 逃逸

    許多操做系統有在文本文件中用反斜槓做爲逃逸標識字符的習慣,可是Windows系統是個例外(在路徑名中使用反斜槓)。在 R 裏面,用戶能夠自行設定這種習慣是否用於數據文件。

    read.table 和 scan 都有一個邏輯參數 allowEscapes。從 R 2.2.0 開始,該參數默認爲否,並且反斜槓是惟一被解釋爲逃逸引用符的字符(在前面描述的環境中)。若是該參數設爲是,以C形式的逃逸規則解釋,也就是控制符如 \a, \b, \f, \n, \r, \t, \v,八進制和十六進制如 \040 和 \0x2A 同樣描述。任何其它逃逸字符都看着是本身,包括反斜槓。

經常使用函數 read.csv 和 read.delim 爲 read.table 設定參數以符合英語語系本地系統中電子表格導出的CSV和製表符分割的文件。這兩個函數對應的變種read.csv2 和 read.delim2 是針對在逗號做爲小數點的國家使用時設計的。

若是 read.table 的可選項設置不正確,錯誤信息一般如下面的形式顯示

     Error in scan(file = file, what = what, sep = sep, :
             line 1 did not have 5 elements

或者

     Error in read.table("files.dat", header = TRUE) :
             more columns than column names

這些信息可能足以找到問題所在,可是輔助函數 count.fields 能夠進一步的深刻研究問題所在。

讀大的數據格子(data grid)時,效率最重要。設定 comment.char = "",以原子向量類型(邏輯型,整型,數值型,複數型,字符型或原味型)設置每列的colClasses ,給定須要讀入的行數 nrows (適當地高估一點比不設置這個參數好)等措施會提升效率。

 

 

相關文章
相關標籤/搜索