嗨,大家好,我就是帥氣的小編~
R語言是進行統計分析和可視化的優秀語言(其實機器學習和網頁製作也可以用R,小聲說~|ω`))
相信大家在利用R語言進行數據分析的時候可能會有大數據分析需求。所謂大數據,很好理解,就是大樣本高維度數據,這樣的數據在當今信息爆炸時代,很是常見。比如醫學數據,數據量大,維度極高,因為醫學的檢測指標多,而且隨著基因測序特別是二代測序等高通量測序(High-throughput sequencing)技術的普及,能一次測上萬的基因,這樣就有幾萬的維度;各種真實世界的統計數據,這些數據比如汽車損耗、公司盈虧也有著大樣本的特點。
那麼大數據如此的多,批處理的需求就比較大了。R語言不考慮並行運算下的簡單批處理實現方式就是for循環。
所以,今天就來教大家怎樣掌握R語言的for循環o(^▽^)o
首先,你需要一個R,百度"R"就行,點擊有官網標識的網站,進去下載就行
打開R或rstudio(都行,小編喜歡rstudio,支持代碼補全、滑鼠操作GUI等功能,用過就不再想用普通的R了)
在左側光標處就可以輸入你的代碼了
for循環基本結構如下
for(變量 in 值){}
for循環的邏輯是設定一個變量如x,x的改變範圍在5到20(這個可以自己設),那麼R就會自動執行{}裡的內容,按x遞增1的順序執行,一直從5,6,7...到20為止。
那麼接下來,小編就通過一個具體的例子來講解for循環(′▽`〃)
代碼都是本人自己寫的哈~
首先編一個二維矩陣數據,這樣的數據是很常見的(如果有現成的文件也可以用read.csv/read.table/read.delim讀入data.frame格式的數據,再用as.matrix函數轉為矩陣)
#這步是新建一個名為data的矩陣,matrix函數後面的c(1:5000)是矩陣填入的數據,是從1,2,3...一直填到5000,nrow是矩陣的行數,可以理解為number of rows,ncol是矩陣的列數,可以理解為number of columns,所以明白了為啥要填5000個數了吧(`)
data <- matrix(c(1:5000),nrow = 100,ncol = 50)
可見1到5000是按列填充的,這就是R語言的一個特性,默認優先進行列運算~
我現在想要進行for循環了,首先明確我的目的是想計算每一行之間的pearson相關係數和P值,最後得到一個4列的data.frame並輸出為csv,可用excel進行進一步編輯。4列的data.frame每一列依次是某一行的行名、與前者進行相關分析的另一行的行名、pearson相關係數、P值,那麼讓我們開始~
N1=c("gene1") #首先把最後4列的data.frame表頭設定好,我這裡用基因1表示,可以隨你換
N2=c("gene2")
R=c("r") #相關係數
P=c("p") #P值
for (r in 1:nrow(data)){ #在下面的{}內r的範圍從1到data的行數,即100
for (t in r:nrow(data)){ #在下面的{}內t的範圍從1到data的行數,兩個for疊加的話,先固定第一個for r=1再執行下一個for,直到下一個for的r從1到100都執行完後再跳到第一個for r=2,再執行r從1到100,再r=3以此類推直到r=100,整個for循環就結束了。這裡用兩個for很巧妙,這樣可以規避計算了第r行與t行的相關數據及第t行與r行的相關數據,造成人為的重複運算
N3=rownames(data)[t] #data行名的第t個數據,這個很好理解,data行名rownames(data)是一個有100個數據的向量vector,從1到100依次是每一行的行名,這裡[t]就取第t個數即第t行行名
N4=rownames(data)[r] #同上取第r行行名
R1=cor(as.numeric(data[t,]),as.numeric(data[r,]),method="pearson") #cor函數計算pearson相關係數,參數裡依次是向量1,向量2,運算方法這裡是pearson,向量1這裡是data第t行的數據,保險起見轉為了numeric即數值型,向量2這裡是data第r行的數據
P1=cor.test(as.numeric(data[t,]),as.numeric(data[r,]),method="pearson")[[3]] #結構同上,這裡是得到P值
N1=c(N1,N3) #把N1和N3合併為N1,這裡N1最開始是gene1,後來每運行一次,就加上一個新的N3,也就是每運行一次,就得到長度加一的向量,加的部分就是相關分析中前者的行名
N2=c(N2,N4) #把N2和N4合併為N2,這裡N2最開始是gene2,後來每運行一次,就加上一個新的N4,也就是每運行一次,就得到長度加一的向量,加的部分就是相關分析中後者的行名,注意N1和N2的順序是一一對應的,因為N1和N2的順序就是每次運行的順序,即N1和N2的第3個數據都是第2次運算的結果
R=c(R,R1) #把N2和N4合併為R,這裡R最開始是r,後來每運行一次,就加上一個新的R1,也就是每運行一次,就得到長度加一的向量,加的部分就是相關分析中相關係數
P=c(P,P1) #把N2和N4合併為P,這裡P最開始是p,後來每運行一次,就加上一個新的P1,也就是每運行一次,就得到長度加一的向量,加的部分就是相關分析中的P值,注意R和P及N1、N2都是一一對應的,理由同上
}
}
Q=data.frame(N1,N2,R,P) #最後把N1,N2,R,P向量按列合併創建成data.frame,因為R和P及N1、N2都是一一對應的,按列合併不會打亂順序,至於為啥是按列,這裡就是前文說的R語言特性~
write.csv(Q,file="G:/PR1.csv") #輸出為csv
這就是結果,為啥N1,N2不變呢?因為沒有設定行名所以每次運算的N3、N4都是空的,所以N1,N2一直都是gene1和gene2。為啥R為1P為0呢?因為看了data就知道了(o)
怎麼樣,R語言for循環有意思吧︿( ̄︶ ̄)~,你學會了嗎?不妨用自己的數據試試~
最後,學習程序語言,小編覺得理解代碼邏輯非常重要(來自一個自學R語言、生物信息學和機器學習的臨床醫學生)
小編資料——武漢大學臨床醫學專業在讀,已發表多篇SCI論文。這是小編的第一篇文章,希望大家多多關注、支持,你們的支持是我走下去的動力
你們還想看怎樣的文章,不妨在評論區談一談,對於R語言或者這篇文章其他內容也可以談一談~