做生物信息分析商玫,少不了的就是數(shù)據(jù),比如轉(zhuǎn)錄組的數(shù)據(jù)牡借,無論是下載的還是測序的拳昌,用R進(jìn)行分析,就必須將這些數(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是一個(gè)帶分隔符的ASCII文本文件帝火。
(2)header
一個(gè)表示文件是否在第一行包含了變量的邏輯型變量溜徙。
如果header設(shè)置為TRUE湃缎,則要求第一行要比數(shù)據(jù)列的數(shù)量少一列。
(3)sep
分開數(shù)據(jù)的分隔符蠢壹。默認(rèn)sep=""嗓违。
read.table()函數(shù)可以將1個(gè)或多個(gè)空格、tab制表符图贸、換行符或回車符作為分隔符蹂季。
(4)quote
用于對有特殊字符的字符串劃定接線的字符串,默認(rèn)值是TRUE(")或單引號疏日。(`)
(5)dec
decimal用于指明數(shù)據(jù)文件中小數(shù)的小數(shù)點(diǎn)偿洁。
(6)numerals
字符串類型。用于指定文件中的數(shù)字轉(zhuǎn)換為雙精度數(shù)據(jù)時(shí)丟失精度的情況下如何進(jìn)行轉(zhuǎn)換沟优。
(7)row.names
保存行名的向量涕滋。可以使用此參數(shù)以向量的形式給出每行的實(shí)際行名挠阁”龇危或者要讀取的表中包含行名稱的列序號或列名字符串。
在數(shù)據(jù)文件中有行頭且首行的字段名比數(shù)據(jù)列少一個(gè)的情況下侵俗,數(shù)據(jù)文件中第1列將被視為行名稱锨用。除此情況外,在沒有給定row.names參數(shù)時(shí)隘谣,讀取的行名將會(huì)自動(dòng)編號增拥。
可以使用row.names = NULL強(qiáng)制行進(jìn)行編號。
(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ù)時(shí)是否轉(zhuǎn)換為因子型變量。當(dāng)其取值為FALSE時(shí)逾苫,該函數(shù)將把字符型數(shù)據(jù)轉(zhuǎn)換為因子型數(shù)據(jù)卿城,取值為TRUE時(shí),仍將其保留為字符型數(shù)據(jù)铅搓。其取值可以是邏輯值向量(必要時(shí)可以循環(huán)賦值)瑟押,數(shù)值型向量或字符型向量,以控制哪些列不被轉(zhuǎn)換為因子星掰。
注意:可以通過設(shè)置參數(shù) colClasses = "character"來阻止所有列轉(zhuǎn)換為因子多望,包括數(shù)值型的列嫩舟。
(10)na.strings
可選的用于表示缺失值的字符向量。
na.strings=c("-9","?")把-9和怀偷?值在讀取數(shù)據(jù)時(shí)候轉(zhuǎn)換成NA
(11)colClasses
用于指定列所屬類的字符串向量家厌。
(12)nrows
整型數(shù)。用于指定從文件中讀取的最大行數(shù)椎工。負(fù)數(shù)或其它無效值將會(huì)被忽略饭于。
(13)skip
整型數(shù)。讀取數(shù)據(jù)時(shí)忽略的行數(shù)维蒙。
(14)check.names
邏輯值掰吕。該參數(shù)值設(shè)置為TRUE時(shí),數(shù)據(jù)框中的變量名將會(huì)被檢查颅痊,以確保符在語法上是有效的變量名稱殖熟。
(15)fill
邏輯值。在沒有忽略空白行的情況下(即blank.lines.skip=FLASE)八千,且fill設(shè)置為TRUE時(shí)吗讶,如果數(shù)據(jù)文件中某行的數(shù)據(jù)少于其他行,則自動(dòng)添加空白域恋捆。
(16)strip.white
邏輯值照皆,默認(rèn)為FALSE。此參數(shù)只在指定了sep參數(shù)時(shí)有效沸停。當(dāng)此參數(shù)設(shè)置為TRUE時(shí)膜毁,數(shù)據(jù)文件中沒有包圍的字符串域的前邊和后邊的空格將會(huì)被去掉。
(17)blank.lines.skip
邏輯值愤钾,此參數(shù)值設(shè)置為TRUE時(shí)瘟滨,數(shù)據(jù)文件中的空白行將被忽略。默認(rèn)值為TRUE能颁。
(18)comment.char
字符型杂瘸。包含單個(gè)字符或空字符的向量。代表注釋字符的開始字符伙菊“苡瘢可以使用""關(guān)閉注釋。
(19)allowEscapes
邏輯值镜硕。類似“\n”這種C風(fēng)格的轉(zhuǎn)義符运翼。如果這種轉(zhuǎn)義符并不是包含在字符串中,該函數(shù)可能解釋為字段分隔符兴枯。
(20)flush
邏輯值血淌。默認(rèn)值為FALSE。當(dāng)該參數(shù)值設(shè)置為TRUE時(shí)财剖,則該函數(shù)讀取完指定列數(shù)后將轉(zhuǎn)到下一行悠夯。這允許用戶在最后一個(gè)字段后面添加注釋癌淮。
(21)stringsAsFactors
邏輯值,標(biāo)記處字符向量是否需要轉(zhuǎn)化為因子疗疟,默認(rèn)是TRUE该默。
(22)fileEncoding
字符串類型,指定文件的編碼方式策彤。如果指定了該參數(shù)栓袖,則文本數(shù)據(jù)按照指定的格式重新編碼。
(23)encoding
假定輸入字符串的編碼方式店诗。
(24)text
字符串類型裹刮。當(dāng)未提供file參數(shù)時(shí),則函數(shù)可以通過一個(gè)文本鏈接從text中讀取數(shù)據(jù)庞瘸。
(25)skipNul
邏輯值捧弃。是否忽略空值。默認(rèn)為FALSE擦囊。
2.寫文件
R 主要用于統(tǒng)計(jì)分析违霞,可能讀文件比寫文件更加常用,但寫文件也很重要瞬场。讀文件用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ù)框眼五。如果不是,它是試圖強(qiáng)迫x到一個(gè)數(shù)據(jù)框彤灶。
file: 一個(gè)字符串命名文件或編寫而打開的一個(gè)連接看幼。" "表示輸出到控制臺(tái)。
append: 邏輯幌陕。只有當(dāng)file是一個(gè)字符串才相關(guān)诵姜。
如果TRUE,輸出追加到文件
如果FALSE搏熄,任何現(xiàn)有文件的名稱被摧毀
quote: 一個(gè)邏輯值(TRUE或FALSE)或數(shù)字向量茅诱。如果TRUE,任何字符或因素列將用雙引號包圍搬卒。如果一個(gè)數(shù)值向量,其元素為引用的列的索引翎卓。在這兩種情況下契邀,行和列名報(bào)價(jià),如果他們被寫入失暴。如果FALSE坯门,并沒有被引用微饥。
sep: 字段分隔符字符串。每一行x中的值都被這個(gè)字符串分隔開古戴。
row.names: 表示x的行名是否與x一起寫的邏輯值欠橘,或者是寫行名的字符向量
col.names: 類似上面。
二现恼、 獲取文件和目錄信息
對于實(shí)現(xiàn)獲取文件和目錄信息肃续,設(shè)置文件訪問權(quán)限等功能,R有各種函數(shù)叉袍。以下是幾個(gè)案例始锚。
file.info():參數(shù)是表示文件名稱的字符串向量,函數(shù)會(huì)給出每個(gè)文件的大小喳逛,創(chuàng)建時(shí)間瞧捌,是否是目錄等信息。
dir():返回一個(gè)字符串向量润文,列出在其第一個(gè)參數(shù)下面整個(gè)目錄所有文件的名稱姐呐。如果指定參數(shù)recursive = TRUE,結(jié)果將吧 第一個(gè)參數(shù)下面整個(gè)目錄樹顯示出來典蝌。
file.exists():返回一個(gè)布爾值曙砂,表示作為參數(shù)的字符串向量中給定的每一個(gè)文件名是否存在。
三赠法、函數(shù)相關(guān)
當(dāng)然麦轰,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ù),可能指定讀入的精度/類型眶熬,默認(rèn)double()例如:what=integer(0)妹笆;what=numeric(0);what=character(0)娜氏;如果SCAN()讀入有字符與數(shù)字拳缠,用what=""來進(jìn)行聲明,則會(huì)把讀入的數(shù)字隱式的都轉(zhuǎn)變成字符贸弥;
sep:指定各個(gè)讀入的數(shù)據(jù)之間的分隔符窟坐;默認(rèn)情況下分隔符:空格、tab;如果不是其它分隔符哲鸳,例如“:/”通過SEP來指定臣疑;
可以通過list指定讀入變量的變量名,同時(shí)生成的對象為列表徙菠,則可以同時(shí)讀入字符與數(shù)字讯沈;
skip 從第幾行開始讀入數(shù)據(jù);
nlines 指定最大讀入行數(shù)婿奔;
如果通過鍵盤輸入的時(shí)候缺狠,不希望出現(xiàn)下標(biāo)提示,則可以使用:quiet=TRUE脸秽;
encoding =””指定的編碼格式儒老,有時(shí)候讀入的中文可能會(huì)出現(xiàn)亂碼的時(shí)候,可能通過這個(gè)參數(shù)來指定:Latin-1 或者 UTF-8记餐;
file = ""時(shí)為手動(dòng)輸入數(shù)據(jù)驮樊。也可以指定特定文件路徑下的文本文件,比如:file= "F:/BioInfoLab/BioInfoCloud/gene.txt"
SCAN幾點(diǎn)注意:
用于讀入純字符或者數(shù)字片酝,沒有表頭囚衔;
如果輸入的單一類型的變量,例如均是:數(shù)值或者均是字符雕沿,用scan效率更高练湿。但其不能讀入混合類型的數(shù)據(jù),也就是在scan()讀入的必須同為字符或者同為數(shù)值审轮;
默認(rèn)情況下用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"
我們手動(dòng)輸入數(shù)字,結(jié)果發(fā)現(xiàn)類型是字符疾渣,因?yàn)槲覀冎付╳hat為character(0),如果我們輸入的是數(shù)字篡诽,會(huì)將數(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
請注意榴捡,命令行在行行首提示的是下一個(gè)輸入項(xiàng)索引杈女,鍵入一個(gè)空行表示結(jié)束輸入,如果不希望報(bào)告已讀取的項(xiàng)目數(shù)吊圾,可以設(shè)置參數(shù)quiet = TRUE达椰。
2、readline()函數(shù)
如果想通過鍵盤輸入單行數(shù)據(jù)项乒,可以使用readline()函數(shù)啰劲。比如:
> aa = readline()
BioInfo_Cloud
> aa
[1] "BioInfo_Cloud"
但是該函數(shù)輸入數(shù)字也當(dāng)成字符串。
> bb = readline()
123434435
> bb
[1] "123434435"
3檀何、print()和cat()函數(shù)
在交互模式下蝇裤,只需要鍵入變量名或者表達(dá)式趁尼,就可以獲取數(shù)據(jù)結(jié)果,但在函數(shù)體內(nèi)部的變量就無法顯示猖辫,這時(shí)候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時(shí)似炎,就可顯示b的值了辛萍。
cat()函數(shù)也是用了打印數(shù)據(jù)在顯示屏上的,比print()稍微好用一點(diǎn)羡藐。print()只能輸出一個(gè)表達(dá)式贩毕,而且輸出的內(nèi)容帶編號,可能會(huì)造成干擾仆嗦。
> print("微信公眾號:bioinfo_cloud")
[1] "微信公眾號:bioinfo_cloud"
> cat("微信公眾號:bioinfo_cloud\n")
微信公眾號:bioinfo_cloud
這就是他們之間的差別辉阶。cat函數(shù)使用是,需要加\n瘩扼,也就是換行轉(zhuǎn)義符谆甜。要不然下次在使用cat時(shí),會(huì)繼續(xù)在同一行輸出集绰。
> cat(1:10)
1 2 3 4 5 6 7 8 9 10
cat默認(rèn)以空格分割规辱,如果不想用,可通過sep參數(shù)自定義設(shè)置栽燕。
> xx = c(2,1,34,12,24,34)
> cat(xx,sep=c(",",".","/","?","\n"))
2,1.34/12?24
34