把外部數(shù)據(jù)讀入R語言里以及在R語言處理的數(shù)據(jù)導(dǎo)出,怎么操作以及注意哪些細(xì)節(jié):
1.認(rèn)識(shí)csv格式
2.認(rèn)識(shí)分隔符
3.將表格文件讀入R語言,成為數(shù)據(jù)框
4.將數(shù)據(jù)框?qū)С?,成為表格文?/p>
5.R語言特有的數(shù)據(jù)的類型:
.Rdata6.文件讀寫部分(重點(diǎn))
7.進(jìn)階:可讀入R語言的常見生信數(shù)據(jù)形式
8.進(jìn)階:讀取文件的其他常用R包
1.認(rèn)識(shí)csv格式
打開ex3.csv文件(生信技能樹數(shù)提供)
windows電腦如果沒有設(shè)置,通常不會(huì)顯示文件后綴名。
設(shè)置:打開文件所在的文件夾--查看前方框打鉤--文件擴(kuò)展名前方框打鉤,顯示文件后綴,電腦知識(shí)一定要加強(qiáng),融會(huì)貫通。

1.1 csv打開方式(一):默認(rèn)使用excel
在里excel自動(dòng)加上橫線和豎線,在渲染效果。

1.2 csv打開方式(二):記事本打開
在excel里有豎線的地方在記事本里變成用逗號(hào)隔開。分隔符為逗號(hào),這是csv的廬山真面目,其實(shí)csv就是純文本文件。

1.3 csv打開方式(三):sublime軟件打開(更適用大文件)
方便打開比較大的純文本文件,記事本如果打開幾百M(fèi)B的文件會(huì)卡,但是sublime不會(huì),而且sublime有代碼高亮的功能,以后慢慢探索。

1.4 csv打開方式(四):R語言讀取
a=read.csv("ex3.csv")
##輸入a=read.csv("")時(shí),光標(biāo)在引號(hào)中間使用tab鍵補(bǔ)全,一定要加引號(hào),不然會(huì)出現(xiàn)找不到對(duì)象,找不到對(duì)象(object)通常有兩種情況:該加引號(hào)不加,或該賦值時(shí)不賦值。

R語言讀取與前面3種方式是不一樣的:
ex3.csv是真實(shí)存在的文件,R語言賦值的變量a不是電腦上一個(gè)真實(shí)文件,R語言內(nèi)部的變量和電腦上的文件不是一碼事,分清環(huán)境里的變量和工作目錄下文件的關(guān)系。
讀進(jìn)R語言,就是個(gè)數(shù)據(jù)框,可賦值,變量名與文件名無必然聯(lián)系。
表格文件讀入到R語言里,就是個(gè)數(shù)據(jù)框,對(duì)數(shù)據(jù)框進(jìn)行的修改(賦值,取子集等)不會(huì)同步到表格文件。
2.認(rèn)識(shí)分隔符
CSV文件本身沒有豎線,用excel打開,為什么會(huì)顯示橫線和豎線,是通過分隔符去識(shí)別的。
CSV文件官方標(biāo)配常見:逗號(hào),空格,制表符\t(用tab鍵摁出來的是制表符,在代碼里顯示的是\t)
CSV的標(biāo)準(zhǔn)分隔符是逗號(hào),也叫逗號(hào)分隔制文件:
CSV = Comma Separated Values
TSV以tab鍵分隔符:
TSV = Tab Separated Values
純文本文件的后綴沒有意義,只是約定俗成(有特例或是不守規(guī)則,不要對(duì)后綴太依賴)。后綴起提示作用,不起決定性作用。
既然后綴不起決定性作用,但是為什么還要加后綴,因?yàn)樵趙indows電腦上有些軟件會(huì)根據(jù)后綴去用什么軟件打開。在編程語言世界里,后綴沒那么強(qiáng),只要文件內(nèi)容是符合規(guī)則的一個(gè)方方正正,有分隔符,叫什么名字不是關(guān)鍵。
3.將表格文件讀入R語言,成為數(shù)據(jù)框
3.1 read.csv()--通常讀取csv格式
3.2 read.table()--通常用于讀取txt格式
以下是非常重要的三個(gè)參數(shù),有時(shí)候不是三個(gè)參數(shù)都一起用,用R語言讀進(jìn)來的文件,與excel打開原表格對(duì)比,選擇合適的參數(shù)。
header = T,
check.names = F,
row.names=1
read.csv()
read.table()
# header = T,
#check.names = F,
#row.names=1
##實(shí)戰(zhàn)中,參數(shù)選不對(duì),導(dǎo)致數(shù)據(jù)框或是表達(dá)矩陣的列名不對(duì),很難進(jìn)行一些操作。
兩者是同宗同源的函數(shù),有些參數(shù)是相同的,但是默認(rèn)參數(shù)設(shè)置可能有所不同。read.csv()是由read.table()演變而來,比較適合讀取常規(guī)的csv文件,它的參數(shù)根據(jù)常規(guī)的csv文件習(xí)慣調(diào)一下默認(rèn)參數(shù),比如說把默認(rèn)的分隔符就設(shè)置為逗號(hào),做了適合讀取csv的設(shè)置。
test = read.csv("ex3.csv")
class(test)
- 再次強(qiáng)調(diào)變量名稱和文件名稱的區(qū)別:
文件名稱寫的話永遠(yuǎn)在實(shí)際參數(shù)的位置上,并且?guī)е?hào)。變量名稱一般都是在等號(hào)前面或是正常寫在代碼里,不會(huì)和引號(hào)一起出現(xiàn)。變量名稱是一個(gè)數(shù)據(jù),而文件名稱是真實(shí)在電腦存在。
- 直接讀取csv如果失敗,需要指定一些參數(shù)。
read.csv()是一個(gè)函數(shù),函數(shù)就有默認(rèn)參數(shù),默認(rèn)參數(shù)與讀入表格對(duì)不上號(hào)的地方,讀取出來比較變扭,比如行名和列名沒有正確識(shí)別出來。
4.將數(shù)據(jù)框?qū)С?,成為表格文?/h3>
導(dǎo)出是指把R語言里的一個(gè)數(shù)據(jù)框?qū)С鋈?,變成電腦上的一個(gè)文件。
4.1 csv格式:write.csv()
write.csv(test,file="example.csv")
##test為要導(dǎo)出的數(shù)據(jù)框的變量名;example為給導(dǎo)出的文件命名,記得寫上后綴csv
##運(yùn)行完工作目錄下就多了一個(gè)文件,可以進(jìn)行發(fā)送。
4.2 txt格式:write.table()
write.table(test,file="example.txt")
##test為要導(dǎo)出的數(shù)據(jù)框的變量名;example為給導(dǎo)出的文件命名,記得寫上后綴txt
讀取--編輯修改--導(dǎo)出,不要覆蓋原文件:
讀取的文件是外部文件,不是自己做的,原始文件一定要保留,如果原文件丟了,代碼出問題,沒法追根溯源,所以導(dǎo)出的文件另取一個(gè)名。
一定要把原始數(shù)據(jù)保存好,運(yùn)行的代碼也保留。
5.R語言特有的數(shù)據(jù)的類型:.Rdata
.Rdata文件里可以存放變量,而且不止一個(gè)變量,也是電腦里真實(shí)存在的文件,放在工作目錄下,用load就可以加載。
.Rdata是R特有的數(shù)據(jù)儲(chǔ)存格式,無法用其他軟件打開,只能用R語言打開。保存的是變量,不是表格文件。凡是在R語言環(huán)境能起名的,占有一席之地的叫變量,可以存到.Rdata里,整存整取。
5.1 用save()--保存
save(test,file="example.Rdata")
##test只是一個(gè)變量名,可以以逗號(hào)為分隔符,添加多個(gè)變量,即可保存多個(gè)。保存多個(gè)變量,file=是不能省略的
5.2 用load()--加載
load("example.Rdata")
##使用時(shí)可以加載,但是保證save的文件在在工作目錄下。
##干干凈凈地加載,直接load就好,不用賦值
5.3 Rproject的組織形式
腳本:.R
數(shù)據(jù):.Rdata
表格:.txt或.csv
常見報(bào)錯(cuò):找不到文件
原因1:文件沒有保存放于工作目錄(Rproject)下。
原因2:拼寫錯(cuò)誤(用tab自動(dòng)補(bǔ)齊)。
默認(rèn)參數(shù)不適用于你的當(dāng)前讀取的文件,也會(huì)報(bào)錯(cuò)
6.文件讀寫部分(重點(diǎn))
6.1 讀取ex1.txt
ex1.txt文件為生信技能樹提供。
ex1=read.table("ex1.txt")
##讀進(jìn)來是第一步,從環(huán)境變量里點(diǎn)開看文件是否正常
ex1[2,4]
#[1] "45351"
##本來應(yīng)該是數(shù)值型,現(xiàn)在是字符型,用Excel打開原文件對(duì)比。
##列名沒有正確識(shí)別的話,一列是一個(gè)向量,一個(gè)向量只有一種數(shù)據(jù)類型,如V1列有id,之后都是數(shù)值型,數(shù)值型變成字符型
?read.table
##在幫助文檔里一個(gè)個(gè)去查看,默認(rèn)設(shè)置header = FALSE,不給識(shí)別列名,修改默認(rèn)參數(shù)。
read.table("ex1.txt",header = T)
#修改header = T,被正確識(shí)別,歸位很重要。
ex1[2,4]
#[1] 31872,數(shù)值型。
讀完后檢查,用excel打開原文件,第一行是應(yīng)該是列名,第二行才是正式內(nèi)容,Excel里不做這個(gè)區(qū)分,R語言里,列名和每一列里正式內(nèi)容是要區(qū)分開的,問題是該有的列名沒有放在正確的位置上。
用R語言正確讀入格式應(yīng)該和用excel打開的格式一樣,仔細(xì)觀察行列的位置。如果不正確,修改函數(shù)的實(shí)際參數(shù),或是默認(rèn)值。

6.2 讀取ex2.csv
ex2.csv文件為生信技能樹提供。
read.csv("ex2.csv")
##初步讀進(jìn)來,在環(huán)境里把變量點(diǎn)開,再用Excel打開對(duì)比,觀察是否有異常
##異常的地方:1.第一列x,2.列名的連接符號(hào)。R語言讀取時(shí),沒有識(shí)別第一行是列名,填充一個(gè)x
?read.csv
##查看幫助文檔的介紹說明,查看是哪一項(xiàng)引起的,可以多試試。
ex2 = read.csv("ex2.csv",row.names = 1)
##row.names = 1,把第一列識(shí)別成行名的意思,# row.names = 1,永遠(yuǎn)設(shè)置為1,。
##串改列名,.和-是不一樣的。R語言改掉是因?yàn)椴辉试S有特殊字符的存在,在幫助文檔里一個(gè)個(gè)去找參數(shù)。
##check.names = TRUE為默認(rèn),檢查行名和列名里有沒有特殊字符,有的話就被改掉,強(qiáng)制把-改為.
ex2 = read.csv("ex2.csv",row.names = 1,check.names = F)
##在環(huán)境里點(diǎn)開ex2,顯示正常
a=as.matrix(ex2)
##表達(dá)矩陣,表達(dá)矩陣的內(nèi)容為數(shù)值,把數(shù)據(jù)框ex2為矩陣
a[1,2]
#[1] 13.67818,如果不設(shè)置row.names = 1,雖然轉(zhuǎn)變?yōu)榫仃?,但是里面的?nèi)容是字符型,沒法作圖和計(jì)算

用R語言讀完后,用excel打開原始文件對(duì)比,找出不一樣的點(diǎn),查看幫助文檔,試著設(shè)置參數(shù)
6.3 讀取soft.txt,賦值給soft
soft = read.table("soft.txt")
##讀進(jìn)來報(bào)錯(cuò),去查看原文件
##報(bào)錯(cuò)解釋:文件本來是有5列,讀著第2行就變成4列,不能識(shí)別。

有一個(gè)深坑:
用sublime打開,看著是空格,沒問題。其實(shí)分隔符號(hào)是有兩個(gè),中間是一個(gè)空著的列,所以才會(huì)有兩個(gè)分隔符。
R語言里識(shí)別的空格符 sep = "",只要是空著就行,識(shí)別空格和\t.給它兩個(gè)制表符,它還是會(huì)識(shí)別成一個(gè)分隔符。兩個(gè)制表符放在一起還是空的,凡是空的東西放在一起,它會(huì)識(shí)別為空的分隔符。
?read.table
##查看幫助文檔,找到參數(shù)
soft = read.table("soft.txt", fill =T )
##加上參數(shù)fill =T,哪個(gè)地方有缺位,就用空格子補(bǔ)全。
##能讀進(jìn)來,在環(huán)境里點(diǎn)擊變量soft看,列名沒有正確識(shí)別,加參數(shù)header =T。
soft = read.table("soft.txt", fill =T, header = T )
##用sublime打開,在空格處,用tab鍵,出現(xiàn)兩個(gè)空格,有一個(gè)為分隔符
soft = read.table("soft.txt", fill =T, header = T, sep = '\t' )
##sep = 為指定分隔符,這里指定的分割符為制表符'\t',指定一個(gè)\t'為分隔符,兩個(gè)制表符放在一起,就知道中間那個(gè)隔該空著,才正常。

- soft 的行數(shù)列數(shù)是多少?列名是什么
dim(soft)
#[1] 1000 5
colnames(soft)
#[1] "ID" "SEQUENCE" "GeneName" "GB_ACC" "SPOT_ID"
- 將soft導(dǎo)出為csv
write.csv(soft,"soft.csv")
##省略形式參數(shù)file=
- 將soft保存為Rdata并加載
將soft保存為Rdata并加載。
save(soft,file = "soft.Rdata")
##只有soft一個(gè)變量時(shí),形式參數(shù)file = 可以省略
rm(list=ls())
##用快捷鍵清空環(huán)境變量或是重啟session(打開窗口)。才能看到加載是否成功。
load("soft.Rdata")
##輸入load("so")用tab鍵補(bǔ)全,加載成功會(huì)在環(huán)境里顯示soft變量

注意:用save() 函數(shù)保存幾個(gè)變量時(shí),形式參數(shù)file=不能省略,因?yàn)閹讉€(gè)變量用逗號(hào)隔開,寫上file=提示變量結(jié)束,可保存。
x= read.table("complete_set.txt")
save(x,file = "x.csv")
##沒報(bào)錯(cuò),看起來還是很正常
a = read.csv("x.csv")
##讀入報(bào)錯(cuò),并且用Excel打開,里面的內(nèi)容亂碼
##假如原始文件丟了,怎么辦?
##用save生成,是Rdata文件,得用load加載
load("x.csv")
##成功加載
###結(jié)論:
##一個(gè)文件是什么類型文件,是由函數(shù)決定的,不是由叫什么(后綴)決定的,后綴只是起提示作用。用什么命令生成才是最重要的,用后綴是為了提示。記住什么樣的命令對(duì)應(yīng)什么樣的文件。
6.4 文件讀入R語言總結(jié):
從外部讀入一個(gè)文件,經(jīng)常從官網(wǎng)上下載讀入,如原始表達(dá)矩陣或是注釋探針ids,在用R語言讀入,同時(shí)用sublime軟件打開,對(duì)比,看看是否需要調(diào)參數(shù),一步步去設(shè)置,畢竟不是自己整的原始表格,有些數(shù)據(jù)的坑需要慢慢去試。
7.進(jìn)階:可讀入R語言的常見生信數(shù)據(jù)形式
7.1 R語言能讀取很多文件格式

生信格式在上游分析的時(shí)候會(huì)提到,一般上游分析用Linux來完成,因?yàn)樯嫌蔚臄?shù)據(jù)比較大,Linux運(yùn)行時(shí)比較快。Rstudio是圖形界面,比較費(fèi)空間,運(yùn)行慢,但是看格式。目前只用在csv和txt,如果以后用生信格式,在網(wǎng)頁上搜索,如:R read.fasta[https://www.rdocumentation.org/packages/seqinr/versions/4.2-8/topics/read.fasta]用得比較少
8.進(jìn)階:讀取文件的其他常用R包
用于讀取/導(dǎo)出文件的R包

read.delim()比較好用,是read.table()的小變體,可以讀取一些txt文件,它的默認(rèn)參數(shù)有的和read.table()的有所區(qū)別。用read.table()讀取txt文件,挑了參數(shù)也不成功,可以換成read.delim(),有可能該文件適合read.delim()的默認(rèn)參數(shù)。
8.1 readr包
https://readr.tidyverse.org/reference/read_delim.html
哈德雷大神寫的包,有幾個(gè)函數(shù),read_table()和read.table()功能有些同,但不是完全一樣的,read_table()等函數(shù)是升級(jí)改造版的,有一些問題,除定義讀取方式外,還定義一種新的數(shù)據(jù)結(jié)構(gòu),叫tibble,用tibble的函數(shù)讀進(jìn)去,就不是正常數(shù)據(jù)框,有兩種數(shù)據(jù),一個(gè)是data.frame一個(gè)是tibble,直接as.data.frame就可以,取子集比較兼容。它升級(jí)的地方在于:1.讀取更加智能些,2.數(shù)據(jù)格式,tibble是一種優(yōu)化的數(shù)據(jù)框。剛?cè)腴T的文件比較小,讀取大文件速度快。
8.2 data.table包:fread()常用的函數(shù)
fread()常用的函數(shù):可以讀入csv格式文件和txt格式文件
智能和快速,行名無用論(大神不處理矩陣,以數(shù)據(jù)框?yàn)槟繕?biāo),但是生信分析需要用表達(dá)矩陣),是哈德雷大神早期寫的包
library(data.table)
a = fread('exp.csv')
##在環(huán)境里點(diǎn)開變量看,沒有行名。
class(a)
#[1] "data.table" "data.frame"
##exp.csv文件用read.csv讀進(jìn)來是數(shù)據(jù)框,但是用fread()讀進(jìn)來變成兩種數(shù)據(jù)格式,不認(rèn)識(shí)"data.table" 格式
##把討厭的"data.table" 去掉,設(shè)置參數(shù)。
a = fread('exp.csv',data.table = F)
class(a)
#[1] "data.frame"
##只有數(shù)據(jù)框,這樣取子集比較兼容
##設(shè)置行名
rownames(a) = a[,1]
a= a[,-1]
b = fread('ex1.txt')
##讀進(jìn)來感覺正常
8.3 rio包
有時(shí)候用R語言自帶的base包里函數(shù)read.table(),找不到一些默認(rèn)參數(shù),就用rio包里的函數(shù):
8.3.1 import():讀入文件
library(rio)
import()
##讀去標(biāo)準(zhǔn)文件時(shí)非常智能,但是讀取不標(biāo)準(zhǔn)文件時(shí)如傻子一樣。
?import
##根據(jù)后綴來怎么讀取代碼,以及一些小參數(shù)設(shè)置,還需要知道后綴只是起提示作用,不是決定作用。
import("gene.csv")
# gene change score
# 1 gene1 up 5
# 2 gene2 up 3
# 3 gene3 down -2
# 4 gene4 down -4
import("gene.csv",format = '\t')
##能正常讀取,包括.counts,soft為后綴的文件,可以用format = '\t'讀取。
import()函數(shù)非常好用,不需要設(shè)置任何參數(shù),可以讀csv,txt,excel。也可以讀取包括.counts,soft為后綴的文件,可用format = '\t'讀取。
8.3.2 export():文件導(dǎo)出
根據(jù)文件的后綴導(dǎo)出什么文件
library(rio)
h = import("gene.csv",format = '\t')
export(h,file = "hh.csv")
##根據(jù)文件的后綴導(dǎo)出什么文件
export(h,file = "hh.xlsx")
##導(dǎo)出為xlsx后綴的文件
h = import("hh.xlsx",format = '\t')
原來用readxl::read_xls()來讀取xlsx文件,但是對(duì)新手不友好的地方在于:依賴rjava,新手很難搞定。所以用rio包里的函數(shù)。
8.3.3 import_list():讀取Excel多個(gè)工作簿
是讀取Excel最好的方式,可以讀取多個(gè)工作簿,就是一個(gè)Excel里有Sheet1,Sheet2..表格。

b = import_list("hh.xlsx")
##Excel里有多個(gè)工作簿就用import_list()函數(shù)讀進(jìn)來,結(jié)果以列表顯示
export(b,file = "hh2.csv")
##可以導(dǎo)出,含多個(gè)工作簿的列表

說明
以上內(nèi)容是聽生信技能樹小潔老師的R語言線上課,根據(jù)自己的理解記錄下來,小潔老師授課非常細(xì)心,對(duì)不同水平的同學(xué)都照顧到,并且補(bǔ)充很多技巧以及注意事項(xiàng)。
沒認(rèn)真學(xué)習(xí)R語言讀進(jìn)csv格式文件前,不知道怎么設(shè)置函數(shù)的參數(shù),經(jīng)常報(bào)錯(cuò),一旦報(bào)錯(cuò)后面的數(shù)據(jù)分析出問題。在實(shí)戰(zhàn)時(shí),從官網(wǎng)下載的文件,讀入文件參數(shù)設(shè)置錯(cuò),沒法分析,比較折磨人。謝謝小潔老師精心設(shè)置的典型表格文件,并引導(dǎo)嘗試解決一些報(bào)錯(cuò)的思路。