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