1.read.table:可以讀TXT也可以讀CSV
(1)file:文件名
(2)header:是否包含表頭
(3)sep:分隔符,如果不設定默認是空格
(4)dec:標志小數點符號,有些國家的小數點是逗號
(5)quote:字符串中間如果有引號的處理
(6)row.names:行名,行名不能重復。row.names=1,表示將第一列設置為行號
(7)col.names:列名
函數 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
的 順序依次判斷字段類型。1如果所有這些類型都失敗了, 變量會轉變成因子。參數
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
是針對在逗號作為小數點的國家使用時設計的2。
如果 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
(適當地高估一點比不設置 這個參數好)等措施會提高效率。