R語言基礎(chǔ)教程 | 文件的輸入與輸出

做生物信息分析商玫,少不了的就是數(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ù)說明如下:

  1. what:聲明讀入為字符類型數(shù)據(jù),可能指定讀入的精度/類型眶熬,默認(rèn)double()例如:what=integer(0)妹笆;what=numeric(0);what=character(0)娜氏;如果SCAN()讀入有字符與數(shù)字拳缠,用what=""來進(jìn)行聲明,則會(huì)把讀入的數(shù)字隱式的都轉(zhuǎn)變成字符贸弥;

  2. sep:指定各個(gè)讀入的數(shù)據(jù)之間的分隔符窟坐;默認(rèn)情況下分隔符:空格、tab;如果不是其它分隔符哲鸳,例如“:/”通過SEP來指定臣疑;

  3. 可以通過list指定讀入變量的變量名,同時(shí)生成的對象為列表徙菠,則可以同時(shí)讀入字符與數(shù)字讯沈;

  4. skip 從第幾行開始讀入數(shù)據(jù);

  5. nlines 指定最大讀入行數(shù)婿奔;

  6. 如果通過鍵盤輸入的時(shí)候缺狠,不希望出現(xiàn)下標(biāo)提示,則可以使用:quiet=TRUE脸秽;

  7. encoding =””指定的編碼格式儒老,有時(shí)候讀入的中文可能會(huì)出現(xiàn)亂碼的時(shí)候,可能通過這個(gè)參數(shù)來指定:Latin-1 或者 UTF-8记餐;

  8. file = ""時(shí)為手動(dòng)輸入數(shù)據(jù)驮樊。也可以指定特定文件路徑下的文本文件,比如:file= "F:/BioInfoLab/BioInfoCloud/gene.txt"

SCAN幾點(diǎn)注意:

  1. 用于讀入純字符或者數(shù)字片酝,沒有表頭囚衔;

  2. 如果輸入的單一類型的變量,例如均是:數(shù)值或者均是字符雕沿,用scan效率更高练湿。但其不能讀入混合類型的數(shù)據(jù),也就是在scan()讀入的必須同為字符或者同為數(shù)值审轮;

  3. 默認(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

轉(zhuǎn)自:https://mp.weixin.qq.com/s?__biz=MzA4NDAzODkzMA==&mid=2651263754&idx=1&sn=2ee999a79c4ed413a63df22bc74f02c8&chksm=841ef777b3697e61824f2fbe053d5d2d427d8881f3e126155a8ac1bba92fff915e5387aadbd9&scene=21#wechat_redirect

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罕袋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碍岔,更是在濱河造成了極大的恐慌浴讯,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件付秕,死亡現(xiàn)場離奇詭異兰珍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)询吴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門掠河,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猛计,你說我怎么就攤上這事唠摹。” “怎么了奉瘤?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵勾拉,是天一觀的道長煮甥。 經(jīng)常有香客問我,道長藕赞,這世上最難降的妖魔是什么成肘? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮斧蜕,結(jié)果婚禮上双霍,老公的妹妹穿的比我還像新娘。我一直安慰自己批销,他們只是感情好洒闸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著均芽,像睡著了一般丘逸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掀宋,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天深纲,我揣著相機(jī)與錄音,去河邊找鬼布朦。 笑死囤萤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的是趴。 我是一名探鬼主播涛舍,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唆途!你這毒婦竟也來了富雅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肛搬,失蹤者是張志新(化名)和其女友劉穎没佑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温赔,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛤奢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陶贼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啤贩。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拜秧,靈堂內(nèi)的尸體忽然破棺而出痹屹,到底是詐尸還是另有隱情,我是刑警寧澤枉氮,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布志衍,位于F島的核電站暖庄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏楼肪。R本人自食惡果不足惜培廓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望春叫。 院中可真熱鬧医舆,春花似錦、人聲如沸象缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽央星。三九已至,卻和暖如春惫东,著一層夾襖步出監(jiān)牢的瞬間莉给,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工廉沮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颓遏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓滞时,卻偏偏與公主長得像叁幢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子坪稽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354