【R】資料匯入讀取read.table函數詳解,如何讀取不規則的資料(fill=T)

來源:互聯網
上載者:User

函數 read.table 是讀取矩形格子狀資料最為便利的方式。因為實際可能遇到的情況比較多,所以預設了一些函數。這些函數調用了 read.table 但改變了它的一些預設參數。

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

一些需要考慮到問題是:

  1. 編碼問題

    如果檔案中包含非-ASCII字元欄位,要確保以正確的編碼方式讀取。這是在UTF-8的本地系統裡面讀取Latin-1檔案的一個主要問題。此時,可以如下處理

              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 顯式地設定;顯式設定的名字會替換首行裡面的列名字(如果存在的話)。

  3. 分隔字元問題

    通常,開啟檔案看一下就可以確定檔案所使用的欄位分隔符號,但對於空白分割的檔案,可以選擇預設的sep = "" (它能使用任何空白符作為分隔字元,比如空格,定位字元,分行符號), sep = " " 或者 sep = "\t"。注意,分隔字元的選擇會影響輸入的被引用的字串。

    如果你有含有空欄位的定位字元分割的檔案,一定要使用 sep = "\t"

  4. 引用 預設情況下,字串可以被 " 或 ' 括起,並且兩種情況下,引號內部的字元都作為字串的一部分。有效引用字元(可能沒有)的設定由參數 quote 控制。對於sep = "\n",預設值改為 quote = ""

    如果沒有設定分隔字元,在被引號括起的字串裡面,引號需要用 C格式的逃逸方式逃逸,即在引號前面直接加反斜線 \。

    如果設定了分隔字元,在被引號括起的字串裡面,按照試算表的習慣,把引號重複兩次以達到逃逸的效果。例如

              '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 將會為資料框的每個變數選擇一個合適的類型。如果欄位沒有缺損以及不能直接轉換,它會按 logicalintegernumericcomplex 的順序依次判斷欄位類型。如果所有這些類型都失敗了,變數會轉變成因子。

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

    注意,colClassesas.is 列專用,而不是個變數。因此,它對列標籤列也同樣適用(如果有的話)。

  10. 注釋

    預設情況下,read.table 用 # 作為注釋標識字元。如果碰到該字元(除了在被引用的字串內),該行中隨後的內容將會被忽略。只含有空白和注釋的行被當作空白行。

    如果確認資料檔案中沒有注釋內容,用 comment.char = "" 會比較安全 (也可能讓速度比較快)。

  11. 逃逸

    許多作業系統有在文字檔中用反斜線作為逃逸標識字元的習慣,但是Windows系統是個例外(在路徑名中使用反斜線)。在 R 裡面,使用者可以自行設定這種習慣是否用於資料檔案。

    read.tablescan 都有一個邏輯參數 allowEscapes。從 R 2.2.0 開始,該參數預設為否,而且反斜線是唯一被解釋為逃逸引用符的字元(在前面描述的環境中)。如果該參數設為是,以C形式的逃逸規則解釋,也就是控制符如 \a, \b, \f, \n, \r, \t, \v,八進位和十六進位如 \040\0x2A 一樣描述。任何其它逃逸字元都看著是自己,包括反斜線。

常用函數 read.csvread.delimread.table 設定參數以符合英語語系本地系統中試算表匯出的CSV和定位字元分割的檔案。這兩個函數對應的變種 read.csv2read.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 (適當地高估一點比不設定這個參數好)等措施會提高效率。

 

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.