函數 read.table 是讀取矩形格子狀資料最為便利的方式。因為實際可能遇到的情況比較多,所以預設了一些函數。這些函數調用了 read.table 但改變了它的一些預設參數。
注意,read.table 不是一種有效地讀大數值矩陣的方法:見下面的 scan 函數。
一些需要考慮到問題是:
- 編碼問題
如果檔案中包含非-ASCII字元欄位,要確保以正確的編碼方式讀取。這是在UTF-8的本地系統裡面讀取Latin-1檔案的一個主要問題。此時,可以如下處理
read.table(file("file.dat", encoding="latin1")) 注意,這在任何可以呈現Latin-1名字的本地系統裡面運行。
- 首行問題
我們建議你明確地設定 header 參數。按照慣例,首行只有對應列的欄位而沒有列標籤對應的欄位。因此,它會比餘下的行少一個欄位。(如果需要在 R 裡面看到這一行,設定 header = TRUE。)如果要讀取的檔案裡面有列標籤的頭欄位(可能是空的),以下面的方式讀取
read.table("file.dat", header = TRUE, row.names = 1) 列名字可以通過 col.names 顯式地設定;顯式設定的名字會替換首行裡面的列名字(如果存在的話)。
- 分隔字元問題
通常,開啟檔案看一下就可以確定檔案所使用的欄位分隔符號,但對於空白分割的檔案,可以選擇預設的sep = "" (它能使用任何空白符作為分隔字元,比如空格,定位字元,分行符號), sep = " " 或者 sep = "\t"。注意,分隔字元的選擇會影響輸入的被引用的字串。
如果你有含有空欄位的定位字元分割的檔案,一定要使用 sep = "\t"。
- 引用 預設情況下,字串可以被 " 或 ' 括起,並且兩種情況下,引號內部的字元都作為字串的一部分。有效引用字元(可能沒有)的設定由參數
quote 控制。對於sep = "\n",預設值改為 quote = ""。如果沒有設定分隔字元,在被引號括起的字串裡面,引號需要用 C格式的逃逸方式逃逸,即在引號前面直接加反斜線 \。
如果設定了分隔字元,在被引號括起的字串裡面,按照試算表的習慣,把引號重複兩次以達到逃逸的效果。例如
'One string isn''t two',"one more"
可以被下面的命令讀取
read.table("testfile", sep = ",") 這在預設分隔符號的檔案裡面不起作用。
- 缺損值 預設情況下,檔案是假定用
NA 表示缺損值,但是,這可以通過參數 na.strings 改變。參數 na.strings 是一個可以包括一個或多個缺損值得字元描述方式的向量。數值列的空欄位也被看作是缺損值。
在數值列,值 NaN,Inf 和 -Inf 都可以被接受的。
- 尾部空欄位省略的行
從一個試算表中匯出的檔案通常會把拖尾的空欄位(包括?塹姆指舴? 忽略掉。為了讀取這樣的檔案,必須設定參數 fill = TRUE。
- 字元欄位中的空白
如果設定了分隔字元,字元欄位起始和收尾處的空白會作為欄位一部分看待的。為了去掉這些空白,可以使用參數 strip.white = TRUE。
- 空白行
預設情況下,read.table 忽略空白行。這可以通過設定 blank.lines.skip = FALSE 來改變。但這個參數只有在和 fill = TRUE 共同使用時才有效。這時,可能是用空白行表明規則資料中的缺損樣本。
- 變數的類型
除非你採取特別的行動,read.table 將會為資料框的每個變數選擇一個合適的類型。如果欄位沒有缺損以及不能直接轉換,它會按 logical, integer, numeric 和 complex 的順序依次判斷欄位類型。如果所有這些類型都失敗了,變數會轉變成因子。
參數 colClasses 和 as.is 提供了很大的控制權。 as.is 會 抑制字元向量轉換成因子(僅僅這個功能)。 colClasses運行為輸入中的每個列設定需要的類型。
注意,colClasses 和 as.is 對每 列專用,而不是每個變數。因此,它對列標籤列也同樣適用(如果有的話)。
- 注釋
預設情況下,read.table 用 # 作為注釋標識字元。如果碰到該字元(除了在被引用的字串內),該行中隨後的內容將會被忽略。只含有空白和注釋的行被當作空白行。
如果確認資料檔案中沒有注釋內容,用 comment.char = "" 會比較安全 (也可能讓速度比較快)。
- 逃逸
許多作業系統有在文字檔中用反斜線作為逃逸標識字元的習慣,但是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 (適當地高估一點比不設定這個參數好)等措施會提高效率。