1. 程式人生 > >終於,我也出了篇R語言入門手冊!

終於,我也出了篇R語言入門手冊!

作者:周運來,男,長大了才會遇到的帥哥,穩健,瀟灑,大方,靠譜。大型測序工廠的螺絲釘,一個R者,一個隨機森林中靠統計覓食的人。

640?wx_fmt=png

1. 什麼是R語言

R語言是一個開源的資料分析環境,起初是由數位統計學家建立起來,以更好的進行統計計算和繪圖,這篇wiki中包含了一些基本情況的介紹。由於R可以通過安裝擴充套件包(Packages)而得到增強,所以其功能已經遠遠不限於統計分析,如果感興趣的話可以到官方網站了解關於其功能的更多資訊。

至於R語言名稱的由來則是根據兩位主要作者的首字母(Robert Gentleman and Ross Ihaka),但過於簡短的關鍵詞也造成在搜尋引擎中很不容易找到相關的資料。不過這個專門的搜尋網站可以幫到你。

640?wx_fmt=png

2. 為什麼要學習R語言

給你一千個R的理由( 地址: https://www.burns-stat.com/documents/tutorials/why-use-the-r-language/ )可能你想說,“我已經學會了spss/sas/stata...,為什麼還要去學習R呢?”

如下幾方面可能會吸引到你:

  1. 程式設計入門語言: 如果你之前沒有程式設計經驗,但是學習工作中經常需要計算、統計、繪圖,那R是你的首選(Python也許不太同意,不管他)。語法結構簡單,上手較快,而且函式和pckages都有很好的例項文件。R是一門自學型語言,來R吧,你不會孤獨。

  2. R是免費開源軟體:現在很多學術期刊都對分析軟體有版權要求,而免費的分析工具可以使你在這方面不會有什麼擔心。另一方面,如果學術界出現一種新的資料分析方法,那麼要過很長一段時間才會出現在商業軟體中。但開源軟體的好處就在於,很快就會有人將這種方法編寫成擴充套件包,或者你自己就可以做這件工作。

  3. 命令列工作方式:許多人喜歡類似SPSS選單式的操作,這對於初學者來說很方便入門,但對於資料分析來說,命令列操作會更加的靈活,更容易進行程式設計和自動化處理。而且命令列操作會更容易耍酷,不是嘛,一般人看到你在狂敲一推程式碼後得到一個分析結果,對你投來的目光是會不一樣的。

  4. 小巧而精悍:R語言的安裝包更小,大約不到40M,相比其它幾個大傢伙它算是非常小巧精悍了。目前R語言非常受到專業人士歡迎,根據對資料探勘大賽勝出者的調查可以發現,他們用的工具基本上都是R語言。此外,從最近幾次R語言大會上可以瞭解到,諮詢業、金融業、醫藥業都在大量的使用R語言,包括google/facebook的大公司都在用它。因此,學習R語言對你的職業發展一定是有幫助的。


640?wx_fmt=png

3. R語言的學習方法
學習R是一件非常輕鬆的事情,初學者需要記住的就是:

利用豐富的幫助文件
親手鍵入程式碼並理解其意義
在筆記裡記下一些重點或心得(個人推薦Evernote)
堅持練習,對手邊的資料進行應用分析
理解背景知識,細節很重要。

R的獲取

640?wx_fmt=png

640?wx_fmt=png

R包(package):R函式、資料、幫助檔案、預編譯程式碼以一種定義完善的格式組成的集合。

.libPaths("E:/Rstudio/R_packages") #指定安裝包的路徑聯網安裝
install.packages(“vegan”) #安裝普通包source(“https://bioconductor.org/biocLite.R”)#安裝Bioconductor包biocLite("DESeq2")

安裝本地zip包
Packages>install packages from local files
library(vegan) #載入包,也可用require()update.packages("vegan") #包的更新installed.packages() #檢視已安裝的包

640?wx_fmt=png

640?wx_fmt=png

1.基礎資料結構

1.1 向量

# 建立向量a <-c(1, 2, 3, 4, 5, 6)
b<-c("one", "two", "three")
c<-c(TRUE, FALSE, TRUE, TRUE, FALSE)#向量索引a[2] #第二個元素a[-2] #刪除第二個元素a[c(2:4)] #取出第二到第四個元素[1] 2[1] 2[1] 1 3 4 5 6

640?wx_fmt=png

1.2 矩陣

#建立矩陣mymat <- matrix(c(1:10), nrow=2, ncol=5, byrow=TRUE)#矩陣索引mymat[2,] #取第二行mymat[,2] #取第二列mymat[1,5] #第一行第五列的元素

640?wx_fmt=png

1.3 陣列

#建立陣列myarr <- array(c(1:12),dim=c(2,3,2))
dim(myarr) #取矩陣或陣列的維度myarr[1,2,1] #取第一個矩陣的第一行第二列

1.4 資料框

640?wx_fmt=png

640?wx_fmt=png

# 建立資料框kids <- c("Wang", "Li")
age <- c("18", "16")
df <- data.frame(kids, age)#資料框索引df[1,] #第一行df[,2] #第二列df[1:2,1:2]#前兩行,前兩列df$kids #根據列名稱#資料框常用函式str(df) #資料框的結構rownames(df) #行名稱colnames(df) #列名稱

1.4.1 因子變數

變數:類別變數,數值變數
類別資料對於分組資料研究非常有用。(男女,高中低)
R中的因子變數類似於類別資料。

#向量因子化status<-c("Poor", "Improved", "Excellent", "Poor") 
status<-factor(status,ordered=TRUE,
    levels= c("Poor","Improved", "Excellent"),
    labels=c("P","I","E"))
index <- sample(1:100,75)
plotdata <- data.frame(index,status)
attach(plotdata)
boxplot(index~status,col="red")

640?wx_fmt=png類別變數,有序變數稱為因子,決定了資料的分析方式和視覺呈現形式

Attach()可以將資料框新增到R的搜尋路徑中,當R遇到一個變數名後,將檢測搜尋路徑中的資料框,定位這個變數

1.5 列表

列表以一種簡單的方式組織和呼叫不相干的資訊,R函式的許多執行結果都是以列表的形式返回

#建立列表lis <- list(name='fred',
    wife='mary',
    no.children=3,
    child.ages=c(4,7,9))#列表索引lis$name #列表元件名lis[[1]] #列表位置訪問
常用函式

640?wx_fmt=png

640?wx_fmt=png

R流程控制

640?wx_fmt=png

p <- 0.1 
if(p<=0.05){  print("p<=0.05!")
}else{  print("p>0.05!")
}

640?wx_fmt=png

for(i in 1:10) {  print(i)
}
i <- 1while(i<10) 
   {    print(i)
    i <- i + 1
  }

640?wx_fmt=png

v <- LETTERS[1:6]for (i in v){  if(i == 'D'){
    next
  }  print(i)
}

640?wx_fmt=png

v <- LETTERS[1:6]for (i in v){  if(i == 'D'){    break
  }  print(i)
}

2.5 R函式

函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段

rcal<-function(x,y){
  z <- x^2 + y^2; 
  result<-sqrt(z) ;
  result;
}
rcal(3,4)# 呼叫函式

3. 讀寫資料

#資料讀入
getwd()
setwd('C:/Users/Administrator/Desktop/file') dir() top<-read.table("otu_table.p10.relative.tran.xls",header=T,row.names=1,sep='\t',stringsAsFactors = F) top10<-t(top) head(top10, n=2)#資料寫出logtop10<-log(top10+0.000001) write.csv(logtop10,file="logtop10.csv", quote=FALSE,  row.names = TRUE) write.table(logtop10,file="logtop10.xls",sep="\t", quote=FALSE,    row.names = TRUE, col.names = TRUE)

其他常用函式

640?wx_fmt=png

4.資料清理

640?wx_fmt=png

4.1 tidyr包

tidyr包的四個函式
寬資料轉為長資料:gather()
長資料轉為寬資料:spread()
多列合併為一列: unite()
將一列分離為多列:separate()

library(tidyr)
gene_exp <- read.table('geneExp.csv',header = T,sep=',',stringsAsFactors = F)
head(gene_exp) #gather 寬資料轉為長資料gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)
head(gene_exp_tidy)#spread 長資料轉為寬資料gene_exp_tidy2<-spread(data = gene_exp_tidy, key = "sample_name", value = "expression")
head(gene_exp_tidy2)

640?wx_fmt=png

4.2 dplyr包

dplyr包五個函式用法:
篩選: filter
排列: arrange()
選擇: select()
變形: mutate()
彙總: summarise()
分組: group_by()

library(tidyr)
library(dplyr)
gene_exp <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F)
gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)#arrange 資料排列gene_exp_GeneID <- arrange(gene_exp_tidy, GeneID)#降序加deschead(gene_exp_GeneID )#filter 資料按條件篩選gene_exp_fiter <- filter(gene_exp_GeneID ,expression>10)
head(gene_exp_fiter)#select 選擇對應的列gene_exp_select <- select(gene_exp_fiter ,sample_name,expression)
head(gene_exp_select)

640?wx_fmt=png

5. 繪圖

640?wx_fmt=png

5.1 長資料與寬資料

640?wx_fmt=png

library(tidyr)
library(ggplot2)#基礎繪圖file <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F,row.names = 1)#寬資料file
barplot(as.matrix(file),names.arg = colnames(file), beside =T ,col=terrain.colors(6))
legend("topleft",legend = rownames(file),fill = terrain.colors(6))#ggplot2繪圖gene_exp <- read.table("geneExp.csv",header=T,sep=",",stringsAsFactors = F)
gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneID)#長資料head(gene_exp_tidy)
ggplot(gene_exp_tidy,aes(x=sample_name,y=expression,fill=GeneID)) + geom_bar(stat='identity',position='dodge')

640?wx_fmt=png

5.2 圖形引數位置

640?wx_fmt=png

x <- rnorm(20, 2, 1)
y <- rnorm(20, 4, 2)
plot(x, y, cex=c(1:3), type="p", pch=19, col = "blue",
     cex.axis=1.5, col.axis="darkgreen", font.axis=2,
     main="這是主標題:plot初試", font.main=2, cex.main=2, col.main="green",
     sub="這是副標題:圖1", font.sub=3, cex.sub=1.5, col.sub="red",
     xlab="這是x軸標籤", ylab="這是y軸標籤",cex.lab=1.5, font.lab=2, col.lab="grey20",
     xlim=c(0,3), ylim=c(0,7))
abline(h=2, v=3, lty=1:2, lwd=2,col="red")
legend("topright", legend="我是圖例\n我在這兒",
      text.col="red", text.width=0.5)#Rnorm正態分佈 個數 平均值 標準差 plot是泛型函式,根據輸入型別的不同而變化#Type p 代表點 l 代表線 b 代表兩者疊加

640?wx_fmt=png

  • 圖形引數:
    符號和線條:pch、cex、lty、lwd
    顏色:col、col.axis、col.lab、col.main、col.sub、fg、bg
    文字屬性:cex、cex.axis、cex.lab、cex.main、cex.sub、font、font.axis、font.lab、font.main、font.sub

  • 文字新增、座標軸的自定義和圖例
    title()、main、sub、xlab、ylab、text()
    axis()、abline()
    legend()

  • 多圖繪製時候,可使用par()設定預設的圖形引數
    par(lwd=2, cex=1.5)

  • 圖形引數設定:
    par(optionname=value,…)
    par(pin=c(width,height)) 圖形尺寸
    par(mfrow=c(nr,nc)) 圖形組合,一頁多圖
    layout(mat) 圖形組合,一頁多圖
    par(mar=c(bottom,left,top,right)) 邊界尺寸
    par(fig=c(x1,x2,y1,y2),new=TURE) 多圖疊加或排布成一幅圖

#圖形組合:attach(mtcars)
opar <- par(no.readonly=TRUE) #複製當前圖形引數設定par(mfrow=c(2,2))#設定圖形引數#layout(matrix(c(1,2,2,3),2,2,byrow=TRUE))plot(wt,mpg,main="Scatterplot of wt vs mpg")
hist(wt,main="Histogram of wt")
boxplot(wt,main="Boxplot of wt")
par(opar) #返回原始圖形引數detach(mtcars)

640?wx_fmt=png

5.3 柱形圖

file <- read.table("barData.csv",header=T,row.names=1,sep=",",stringsAsFactors = F)
dataxx <- as.matrix(file) #轉化為矩陣cols <- terrain.colors(3) #抽取顏色#誤差線函式plot.error <- function(x, y, sd, len = 1, col = "black") {
  len <- len * 0.05
    arrows(x0 = x, y0 = y, x1 = x, y1 = y - sd, col = col, angle = 90, length = len)
    arrows(x0 = x, y0 = y, x1 = x, y1 = y + sd, col = col, angle = 90, length = len) 
} 
x <- barplot(dataxx, offset = 0, ylim=c(0, max(dataxx) * 1.1),axis.lty = 1, names.arg = colnames(dataxx), col = cols, beside = TRUE) 
box() 
legend("topright", legend = rownames(dataxx), fill = cols, box.col = "transparent") 
title(main = "An example of barplot", xlab = "Sample", ylab = "Value") 
sd <- dataxx * 0.1 for (i in 1:3) {
  plot.error(x[i, ], dataxx[i, ], sd = sd[i, ])
}

640?wx_fmt=png

5.4 二元圖

640?wx_fmt=png

matdata <- read.table("plot_observed_species.xls", header=T)
tbl_df(matdata) #檢視資料屬性和結構y<-matdata[,2:145]
attach(matdata)
matplot(series,y, 
        ylab="Observed Species Number",xlab="Sequences Number",
        lty=1,lwd=2,type="l",col=1:145,cex.lab=1.2,cex.axis=0.8)
legend("topleft",lty=1, lwd=2, legend=names(y)[1:8], 
       cex=0.5,col=1:145)
detach(matdata)

640?wx_fmt=png

5.5 餅狀圖

relative<-c(0.270617,0.177584,0.194911,0.054685,0.048903,0.033961, 0.031195,0.188143)
taxon<-c("Sordariales","Pleosporales","Agaricales","Hypocreales",   "Pezizales","Eurotiales","Helotiales","Others")
ratio<-round(relative*100,2)
ratio<-paste(ratio,"%",sep="")
label<-paste(taxon,ratio,sep=" ")
pie(relative,labels=label, main="ITS1-Sample S1",   radius=1,col=rainbow(length(label)),cex=1.3)
library(plotrix)
fan.plot(relative,labels=label,main="Fan plot")
pie3D(relative,labels=label, height=0.2, theta=pi/4, explode=0.1, col=rainbow(length(label)),  border="black",font=2,radius=1,labelcex=0.9)

640?wx_fmt=png

5.6 直方圖

seqlength<-rnorm(1000, 350, 30)hist(seqlength,breaks=100,
     col="red",freq=FALSE, 
     main="Histogram with dengsitycurve",     ylab="Density", xlab="Sequence length")lines(density(seqlength),col="blue4",lwd=2)

640?wx_fmt=png

5.7 聚類圖

clu <- read.table("unweighted_unifrac_dm.txt", header=T, row.names=1, sep="\t")
head(clu)
dis <- as.dist(clu)
h <- hclust(dis, method="average")
plot(h, hang = 0.1, axes = T, frame.plot = F, main="Cluster Dendrogram based on unweighted_unifrac", sub="UPGMA")

640?wx_fmt=png

5.8 維恩圖

library(VennDiagram)
ven<-list(sample1=20:50,  sample2=c(1:30,50:80), sample3=40:90, sample4=c(10:30,70:100))
venn.diagram(ven, filename='venn.png', cex=1.2, col="black", alpha= 0.50,lwd =1.2, cat.cex=1.4,               fill=c("cornflowerblue", "green", "Gold1","darkorchid1"),  margin=0.15)

640?wx_fmt=png

圖片輸出

  • 直接匯出

    640?wx_fmt=png

  • 命令

pdf(file="file.pdf", width=7, height=10)
png(file="file.png",width=480,height=480)
jpeg(file="file.png",width=480,height=480)
tiff(file="file.png",width=480,height=480)

dev.off()

參考資料:

1. R|home https://www.r-project.org

2. 雪晴網 http://www.xueqing.tv

3. 統計之都 https://cosx.org

4. R語言基礎入門之一:引言

https://www.cnblogs.com/wentingtu/archive/2012/03/03/2377969.html

5. R語言在生態學研究中的應用分析

 http://blog.sciencenet.cn/blog-267448-1058416.html

6.為什麼生態學家要學習Python或者R?

http://blog.sciencenet.cn/blog-255662-1093799.html

7. Statistical tools for high-throughput data analysis http://www.sthda.com/french/

8. why-use-the-r-language

https://www.burns-stat.com/documents/tutorials/why-use-the-r-language/

9. Why R? The pros and cons of the R language

https://www.infoworld.com/article/2940864/application-development/r-programming-language-statistical-data-analysis.html

10.Why use R? Five reasons

https://www.r-bloggers.com/why-use-r-five-reasons/