分享

30 天学会R DAY 12:自定义函数的初步学习

 妙趣横生统计学 2019-12-08

     第12 自定义函数的初步学习

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)  #v1v2

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+yxy是未知参数,s为两者之。然后我们对未知参数xy赋值,根据函数算出和s,最后展示s值,或者数据库增加一列s

二、自定义函数的作用

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

三、自定义函数的格式

格式:

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

statements

return(object)

}

函数名称为myfunction

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

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

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

举例

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

这里面有两个参数是需要我们提供的xn,因此函数骨架是functionxn),

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=5n=10,那么根据我们自定义的函数x.n()得到什么结果呢?

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

四、练习题

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

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

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

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

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

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

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

#编写程序:

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的内容就介绍到这里!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多