第12天 自定義函數(shù)的初步學(xué)習(xí) R語言中,絕大多數(shù)的函數(shù),是軟件提供的,或者R包提供的,可以直接調(diào)用R后臺(tái)的算法,幫助我們進(jìn)行計(jì)算。比如我們計(jì)算標(biāo)準(zhǔn)差sd時(shí),無需采用公式去計(jì)算,而是調(diào)用sd()函數(shù)即可。但R語言也提供了一種R函數(shù)的編寫方法,實(shí)在沒有找到相應(yīng)方便函數(shù)時(shí),可以自行編寫函數(shù),方便計(jì)算,我們稱之為自定義函數(shù)或者自編函數(shù)。R入門者實(shí)際上無需自己去編寫函數(shù),這里只介紹入門,便于以后進(jìn)行深入學(xué)習(xí)。 · 第11天最后練習(xí)題及其答案 練習(xí)題: 對(duì)于不同的數(shù)據(jù),以計(jì)算一個(gè)新變量, 當(dāng)v1變量<3時(shí)候,這個(gè)新變量是原來變量i次方; 當(dāng)v1變量為<4時(shí)候,這個(gè)變量是原變量的i-1次方; 當(dāng)v1<5的時(shí)候,這個(gè)變量是原變量的i-2次方; 當(dāng)v1>=5的時(shí)候,這個(gè)變量是上一個(gè)變量值+10; 思考答案: for(i in 1:length(z$v1)){ if(z$v1[i]<3){ z$v7[i]<-z$v1[i]^i } else if(z$v1[i]<4){ z$v7[i]<-z$v1[i]^(i-1) } else if(z$v1[i]<5){ z$v7[i]<-z$v1[i]^(i-2) } else { z$v7[i]<-z$v7[i-1]+10 } } z 一、自定義函數(shù)案例 # 繪制計(jì)算兩者和的函數(shù); function1 <- function(x,y){ s<-x+y return(s) } > z<-data.frame(v1=1:5,v2=6:10,v3=11:15) #產(chǎn)生數(shù)據(jù)框 > z >function1(z$v1,z$v2) #對(duì)v1和v2求和 z$s= function1(z$v1,z$v2) # v1和v2求和作為z數(shù)據(jù)框新的變量 > z v1 v2 v3 s 1 1 6 11 7 2 2 7 12 9 3 3 8 13 11 4 4 9 14 13 5 5 10 15 15 這段函數(shù)什么意思呢? 首先,我編寫個(gè)程序,用來求兩個(gè)數(shù)據(jù)的和,x+y。xy是未知參數(shù),s為兩者之和。然后我們對(duì)未知參數(shù)x、y賦值,根據(jù)函數(shù)算出和s,最后展示s值,或者數(shù)據(jù)庫增加一列s 二、自定義函數(shù)的作用 自定義函數(shù)最大的作用,是幫助我們批量操作!無論是數(shù)據(jù)整理還是計(jì)算分析。如果我們重復(fù)操作某些方法,要么你復(fù)制黏貼代碼,改各種名稱,要么,采用自編函數(shù)的方法簡化操作。 三、自定義函數(shù)的格式 格式: myfuntion<-function(arg1,arg2,…){ statements return(object) } 函數(shù)名稱為myfunction; arg1,arg2 為參數(shù),是未知的,是后續(xù)需要提供給R語言的。 statements 為函數(shù)語句,根據(jù)arg1,arg2進(jìn)行的各種計(jì)算 return(object)返回結(jié)果。 Statements會(huì)產(chǎn)生各種結(jié)果,將想要的結(jié)果object提取出來給我們 舉例 # 編寫程序計(jì)算 h(x,n)=1+x+x^2+……+x^n. 這里面有兩個(gè)參數(shù)是需要我們提供的x,n,因此函數(shù)骨架是function(x,n), x.n <- function(x,n){ #自編函數(shù)骨架,x.n為自定義函數(shù)名 h <- 0 # 標(biāo)紅的是statements,采用循環(huán)的方法進(jìn)行運(yùn)算 for(i in 0:n){ h <- h+x^i } return(h) #最后返回的最后一次循環(huán)的h值,也就是累和,是函數(shù)最后輸出值。 } x.n(x=5,n=10) # 如果x=5,n=10,那么根據(jù)我們自定義的函數(shù)x.n()得到什么結(jié)果呢? 值得提醒的是,自編函數(shù)存在著一對(duì){},循環(huán)語句也存在著一對(duì){},千萬不能少掉一個(gè),如果循環(huán)語句還有if語句,那么有更多的{}了。 四、練習(xí)題 第11天的練習(xí)題我們?cè)MT位通過循環(huán)和條件語句計(jì)算: # 對(duì)于數(shù)據(jù)庫z,以計(jì)算一個(gè)新變量,當(dāng)v1變量<3時(shí)候,這個(gè)新變量是原來變量i次方 # 當(dāng)v1變量為<4時(shí)候,這個(gè)變量是原變量的i-1次方; # 當(dāng)v1<5的時(shí)候,這個(gè)變量是原變量的i-2次方; # 當(dāng)v1>=5的時(shí)候,這個(gè)變量是上一個(gè)變量值+10; 現(xiàn)在,我們針對(duì)的不僅是v1,也可能是v2,v3都需要類似的操作,那么我們需要編寫一個(gè)函數(shù)方便批量操作。 這個(gè)新的自變函數(shù)更為復(fù)雜,它涵蓋了自編、循環(huán)和條件三種語句,層層嵌套。答案如下: #編寫程序: function2 <- function(x) { for(i in 1:length(x)){ if(x[i]<3){ y[i]<-x[i]^i } else if(x[i]<4){ y[i]<-x[i]^(i-1) } else if(x[i]<5){ y[i]<-x[i]^(i-2) } else { y[i]<-y[i-1]+10 } } return(y) } #根據(jù)不同的參數(shù)計(jì)算值 attach(z) z$v7<-function2(v1) # 根據(jù)z數(shù)據(jù)框的v1求新的變量v7 z 或者z$v7<-function2(z["v1"]) 對(duì)于醫(yī)學(xué)數(shù)據(jù)分析而言,自編函數(shù)并不多見,但它作為一種批量操作,在某些場合具有一定的價(jià)值,幫助我們快速進(jìn)行數(shù)據(jù)整理、轉(zhuǎn)換、和統(tǒng)計(jì)分析。如果你看完之后,也不甚理解,可以放棄這一塊知識(shí)。 DAY12的內(nèi)容就介紹到這里! |
|