做生物信息分析,少不了的就是數(shù)據(jù),比如轉(zhuǎn)錄組的數(shù)據(jù),無論是下載的還是測序的,用R進行分析,就必須將這些數(shù)據(jù)讀入,分析的結(jié)果,比如一些圖,就少不了輸出,因此,文件的讀寫在數(shù)據(jù)分析中是比較常用的。
一、讀寫文件
1. 從文件中讀取數(shù)據(jù)庫或矩陣
read.table()函數(shù)是R最基本函數(shù)之一,主要用來讀取矩形表格數(shù)據(jù)。
Usage
read.table(file, header = FALSE, sep = "", quote = "\"'",
dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
row.names, col.names, as.is = !stringsAsFactors,
na.strings = "NA", colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(),
fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
各參數(shù)的說明如下:
(1)file
file是一個帶分隔符的ASCII文本文件。
(2)header
一個表示文件是否在第一行包含了變量的邏輯型變量。
如果header設(shè)置為TRUE,則要求第一行要比數(shù)據(jù)列的數(shù)量少一列。
(3)sep
分開數(shù)據(jù)的分隔符。默認sep=""。
read.table()函數(shù)可以將1個或多個空格、tab制表符、換行符或回車符作為分隔符。
(4)quote
用于對有特殊字符的字符串劃定接線的字符串,默認值是TRUE(")或單引號。(`)
(5)dec
decimal用于指明數(shù)據(jù)文件中小數(shù)的小數(shù)點。
(6)numerals
字符串類型。用于指定文件中的數(shù)字轉(zhuǎn)換為雙精度數(shù)據(jù)時丟失精度的情況下如何進行轉(zhuǎn)換。
(7)row.names
保存行名的向量??梢允褂么藚?shù)以向量的形式給出每行的實際行名?;蛘咭x取的表中包含行名稱的列序號或列名字符串。
在數(shù)據(jù)文件中有行頭且首行的字段名比數(shù)據(jù)列少一個的情況下,數(shù)據(jù)文件中第1列將被視為行名稱。除此情況外,在沒有給定row.names參數(shù)時,讀取的行名將會自動編號。
可以使用row.names = NULL強制行進行編號。
(8)col.names
指定列名的向量。缺省情況下是又"V"加上列序構(gòu)成,即V1,V2,V3......
Tip:
rownames、colnames是base包中的行名、列名函數(shù);
而row.names、col.names是read.table函數(shù)中的行名、參數(shù)
(9)as.is
該參數(shù)用于確定read.table()函數(shù)讀取字符型數(shù)據(jù)時是否轉(zhuǎn)換為因子型變量。當其取值為FALSE時,該函數(shù)將把字符型數(shù)據(jù)轉(zhuǎn)換為因子型數(shù)據(jù),取值為TRUE時,仍將其保留為字符型數(shù)據(jù)。其取值可以是邏輯值向量(必要時可以循環(huán)賦值),數(shù)值型向量或字符型向量,以控制哪些列不被轉(zhuǎn)換為因子。
注意:可以通過設(shè)置參數(shù) colClasses = "character"來阻止所有列轉(zhuǎn)換為因子,包括數(shù)值型的列。
(10)na.strings
可選的用于表示缺失值的字符向量。
na.strings=c("-9","?")把-9和?值在讀取數(shù)據(jù)時候轉(zhuǎn)換成NA
(11)colClasses
用于指定列所屬類的字符串向量。
(12)nrows
整型數(shù)。用于指定從文件中讀取的最大行數(shù)。負數(shù)或其它無效值將會被忽略。
(13)skip
整型數(shù)。讀取數(shù)據(jù)時忽略的行數(shù)。
(14)check.names
邏輯值。該參數(shù)值設(shè)置為TRUE時,數(shù)據(jù)框中的變量名將會被檢查,以確保符在語法上是有效的變量名稱。
(15)fill
邏輯值。在沒有忽略空白行的情況下(即blank.lines.skip=FLASE),且fill設(shè)置為TRUE時,如果數(shù)據(jù)文件中某行的數(shù)據(jù)少于其他行,則自動添加空白域。
(16)strip.white
邏輯值,默認為FALSE。此參數(shù)只在指定了sep參數(shù)時有效。當此參數(shù)設(shè)置為TRUE時,數(shù)據(jù)文件中沒有包圍的字符串域的前邊和后邊的空格將會被去掉。
(17)blank.lines.skip
邏輯值,此參數(shù)值設(shè)置為TRUE時,數(shù)據(jù)文件中的空白行將被忽略。默認值為TRUE。
(18)comment.char
字符型。包含單個字符或空字符的向量。代表注釋字符的開始字符??梢允褂?"關(guān)閉注釋。
(19)allowEscapes
邏輯值。類似“\n”這種C風格的轉(zhuǎn)義符。如果這種轉(zhuǎn)義符并不是包含在字符串中,該函數(shù)可能解釋為字段分隔符。
(20)flush
邏輯值。默認值為FALSE。當該參數(shù)值設(shè)置為TRUE時,則該函數(shù)讀取完指定列數(shù)后將轉(zhuǎn)到下一行。這允許用戶在最后一個字段后面添加注釋。
(21)stringsAsFactors
邏輯值,標記處字符向量是否需要轉(zhuǎn)化為因子,默認是TRUE。
(22)fileEncoding
字符串類型,指定文件的編碼方式。如果指定了該參數(shù),則文本數(shù)據(jù)按照指定的格式重新編碼。
(23)encoding
假定輸入字符串的編碼方式。
(24)text
字符串類型。當未提供file參數(shù)時,則函數(shù)可以通過一個文本鏈接從text中讀取數(shù)據(jù)。
(25)skipNul
邏輯值。是否忽略空值。默認為FALSE。
2.寫文件
R 主要用于統(tǒng)計分析,可能讀文件比寫文件更加常用,但寫文件也很重要。讀文件用read.table(),寫文件就用write.table()。
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
eol = "\n", na = "NA", dec = ".", row.names = TRUE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
參數(shù)說明:
x: 要寫入的對象,最好是矩陣或數(shù)據(jù)框。如果不是,它是試圖強迫x到一個數(shù)據(jù)框。
file: 一個字符串命名文件或編寫而打開的一個連接。" "表示輸出到控制臺。
append: 邏輯。只有當file是一個字符串才相關(guān)。
如果TRUE,輸出追加到文件
如果FALSE,任何現(xiàn)有文件的名稱被摧毀
quote: 一個邏輯值(TRUE或FALSE)或數(shù)字向量。如果TRUE,任何字符或因素列將用雙引號包圍。如果一個數(shù)值向量,其元素為引用的列的索引。在這兩種情況下,行和列名報價,如果他們被寫入。如果FALSE,并沒有被引用。
sep: 字段分隔符字符串。每一行x中的值都被這個字符串分隔開。
row.names: 表示x的行名是否與x一起寫的邏輯值,或者是寫行名的字符向量
col.names: 類似上面。
二、 獲取文件和目錄信息
對于實現(xiàn)獲取文件和目錄信息,設(shè)置文件訪問權(quán)限等功能,R有各種函數(shù)。以下是幾個案例。
file.info():參數(shù)是表示文件名稱的字符串向量,函數(shù)會給出每個文件的大小,創(chuàng)建時間,是否是目錄等信息。
dir():返回一個字符串向量,列出在其第一個參數(shù)下面整個目錄所有文件的名稱。如果指定參數(shù)recursive = TRUE,結(jié)果將吧 第一個參數(shù)下面整個目錄樹顯示出來。
file.exists():返回一個布爾值,表示作為參數(shù)的字符串向量中給定的每一個文件名是否存在。
三、函數(shù)相關(guān)
當然,R除了可以讀入文件數(shù)據(jù)外,也提供了鍵盤和顯示器的接口,比如可以用scan()和readline()函數(shù)通過鍵盤錄入數(shù)據(jù),可以通過print()函數(shù)將結(jié)果打印到顯示器上,print()在之前的章節(jié)中都有用到。
1、scan()函數(shù)
scan(file = "", what = double(0), nmax = -1, n = -1, sep = "",
quote = if(identical(sep, "\n")) "" else "'\"", dec = ".",
skip = 0, nlines = 0, na.strings = "NA",
flush = FALSE, fill = FALSE, strip.white = FALSE,
quiet = FALSE, blank.lines.skip = TRUE, multi.line = TRUE,
comment.char = "", allowEscapes = FALSE, encoding = "unknown")
主要的參數(shù)說明如下:
what:聲明讀入為字符類型數(shù)據(jù),可能指定讀入的精度/類型,默認double()例如:what=integer(0);what=numeric(0);what=character(0);如果SCAN()讀入有字符與數(shù)字,用what=""來進行聲明,則會把讀入的數(shù)字隱式的都轉(zhuǎn)變成字符;
sep:指定各個讀入的數(shù)據(jù)之間的分隔符;默認情況下分隔符:空格、tab;如果不是其它分隔符,例如“:/”通過SEP來指定;
可以通過list指定讀入變量的變量名,同時生成的對象為列表,則可以同時讀入字符與數(shù)字;
skip 從第幾行開始讀入數(shù)據(jù);
nlines 指定最大讀入行數(shù);
如果通過鍵盤輸入的時候,不希望出現(xiàn)下標提示,則可以使用:quiet=TRUE;
encoding =””指定的編碼格式,有時候讀入的中文可能會出現(xiàn)亂碼的時候,可能通過這個參數(shù)來指定:Latin-1 或者 UTF-8;
file = ""時為手動輸入數(shù)據(jù)。也可以指定特定文件路徑下的文本文件,比如:file= "F:/BioInfoLab/BioInfoCloud/gene.txt"
SCAN幾點注意:
用于讀入純字符或者數(shù)字,沒有表頭;
如果輸入的單一類型的變量,例如均是:數(shù)值或者均是字符,用scan效率更高。但其不能讀入混合類型的數(shù)據(jù),也就是在scan()讀入的必須同為字符或者同為數(shù)值;
默認情況下用scan讀入的數(shù)據(jù)生成向量類型(這也就是為什么讀入的數(shù)據(jù)必須是同為字符或者同為數(shù)字)。
> num = scan(file = "",what = character(0))
1: 1
2: 2
3: 3
4:
Read 3 items
> num
[1] "1" "2" "3"
> class(num)
[1] "character"
我們手動輸入數(shù)字,結(jié)果發(fā)現(xiàn)類型是字符,因為我們指定what為character(0),如果我們輸入的是數(shù)字,會將數(shù)字轉(zhuǎn)化成字符。
> num1 = scan(file = "",what = numeric(0))
1: 1
2: 2
3: 3
4: 4
5:
Read 4 items
> class(num1)
[1] "numeric"
> num1 = scan(file = "")
1: 12
2: 21
3:
Read 2 items
> class(num1)
[1] "numeric"
> num1
[1] 12 21
請注意,命令行在行行首提示的是下一個輸入項索引,鍵入一個空行表示結(jié)束輸入,如果不希望報告已讀取的項目數(shù),可以設(shè)置參數(shù)quiet = TRUE。
2、readline()函數(shù)
如果想通過鍵盤輸入單行數(shù)據(jù),可以使用readline()函數(shù)。比如:
> aa = readline()
BioInfo_Cloud
> aa
[1] "BioInfo_Cloud"
但是該函數(shù)輸入數(shù)字也當成字符串。
> bb = readline()
123434435
> bb
[1] "123434435"
3、print()和cat()函數(shù)
在交互模式下,只需要鍵入變量名或者表達式,就可以獲取數(shù)據(jù)結(jié)果,但在函數(shù)體內(nèi)部的變量就無法顯示,這時候print()函數(shù)就排上用場了。
> x = 1:3
> x
[1] 1 2 3
> 1+3
[1] 4
> fun = function(){b = 3}
> fun
function(){b = 3}
> fun()
>
> b
Error: object 'b' not found
> fun1= function(){
+ b = 3
+ print(b)}
> fun1
function(){
b = 3
print(b)}
> fun1()
[1] 3
上面的代碼我們看到,函數(shù)fun中的b在交互模式下是顯示不出來的,在fun1函數(shù)中通過print()函數(shù),在調(diào)用fun1時,就可顯示b的值了。
cat()函數(shù)也是用了打印數(shù)據(jù)在顯示屏上的,比print()稍微好用一點。print()只能輸出一個表達式,而且輸出的內(nèi)容帶編號,可能會造成干擾。
> print("微信公眾號:bioinfo_cloud")
[1] "微信公眾號:bioinfo_cloud"
> cat("微信公眾號:bioinfo_cloud\n")
微信公眾號:bioinfo_cloud
這就是他們之間的差別。cat函數(shù)使用是,需要加\n,也就是換行轉(zhuǎn)義符。要不然下次在使用cat時,會繼續(xù)在同一行輸出。
> cat(1:10)
1 2 3 4 5 6 7 8 9 10
cat默認以空格分割,如果不想用,可通過sep參數(shù)自定義設(shè)置。
> xx = c(2,1,34,12,24,34)
> cat(xx,sep=c(",",".","/","?","\n"))
2,1.34/12?24
34