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

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

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

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

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

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

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

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

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

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

SCAN幾點注意:

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

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

  3. 默認情況下用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

轉(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容