30 天学会R DAY 12:自定义函数的初步学习
卖萌控的博客
点击这里进入电脑版页面!体验更好
30 天学会R DAY 12:自定义函数的初步学习
2022-6-4 萌小白
93a2176a329156b7593c48fb301340a3.jpeg


R语言中,绝大多数的函数,是软件提供的,或者R包提供的,可以直接调用R后台的算法,帮助我们进行计算。比如我们计算标准差sd时,无需采用公式去计算,而是调用sd()函数即可。但R语言也提供了一种R函数的编写方法,实在没有找到相应方便函数时,可以自行编写函数,方便计算,我们称之为自定义函数或者自编函数。R入门者实际上无需自己去编写函数,这里只介绍入门,便于以后进行深入学习。



第11天最后练习题及其答案



练习题:



对于不同的数据,以计算一个新变量,



当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



一、自定义函数案例


# 绘制计算两者和的函数;



function1 <- function(x,y){



s<-x+y



return(s)



}



> z<-data.frame(v1=1:5,v2=6:10,v3=11:15) #产生数据框



> z



>function1(z$v1,z$v2) #对v1和v2求和



z$s= function1(z$v1,z$v2) # v1和v2求和作为z数据框新的变量



> 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



这段函数什么意思呢? 首先,我编写个程序,用来求两个数据的和,x+y。xy是未知参数,s为两者之和。然后我们对未知参数x、y赋值,根据函数算出和s,最后展示s值,或者数据库增加一列s



二、自定义函数的作用


自定义函数最大的作用,是帮助我们批量操作!无论是数据整理还是计算分析。如果我们重复操作某些方法,要么你复制黏贴代码,改各种名称,要么,采用自编函数的方法简化操作。



三、自定义函数的格式


格式:



myfuntion<-function(arg1,arg2,…){



statements



return(object)



}



函数名称为myfunction;



arg1,arg2 为参数,是未知的,是后续需要提供给R语言的。



statements 为函数语句,根据arg1,arg2进行的各种计算



return(object)返回结果。 Statements会产生各种结果,将想要的结果object提取出来给我们



举例



# 编写程序计算 h(x,n)=1+x+x^2+……+x^n.



这里面有两个参数是需要我们提供的x,n,因此函数骨架是function(x,n),



x.n <- function(x,n){ #自编函数骨架,x.n为自定义函数名



h <- 0 # 标红的是statements,采用循环的方法进行运算



for(i in 0:n){



h <- h+x^i



}



return(h) #最后返回的最后一次循环的h值,也就是累和,是函数最后输出值。



}



x.n(x=5,n=10) # 如果x=5,n=10,那么根据我们自定义的函数x.n()得到什么结果呢?



值得提醒的是,自编函数存在着一对{},循环语句也存在着一对{},千万不能少掉一个,如果循环语句还有if语句,那么有更多的{}了。



四、练习题


第11天的练习题我们曾希望诸位通过循环和条件语句计算:



# 对于数据库z,以计算一个新变量,当v1变量<3时候,这个新变量是原来变量i次方



# 当v1变量为<4时候,这个变量是原变量的i-1次方;



# 当v1<5的时候,这个变量是原变量的i-2次方;



# 当v1>=5的时候,这个变量是上一个变量值+10;



现在,我们针对的不仅是v1,也可能是v2,v3都需要类似的操作,那么我们需要编写一个函数方便批量操作。



这个新的自变函数更为复杂,它涵盖了自编、循环和条件三种语句,层层嵌套。答案如下:



#编写程序:



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)



}



#根据不同的参数计算值



attach(z)



z$v7<-function2(v1) # 根据z数据框的v1求新的变量v7



z



或者z$v7<-function2(z["v1"])



对于医学数据分析而言,自编函数并不多见,但它作为一种批量操作,在某些场合具有一定的价值,帮助我们快速进行数据整理、转换、和统计分析。如果你看完之后,也不甚理解,可以放弃这一块知识。



DAY12的内容就介绍到这里!




转自:医学论文与统计分析
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容