首页 > 科研教程 > 30 天学会R DAY 12:自定义函数的初步学习
2022
06-04

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

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


转自:医学论文与统计分析

最后编辑:
作者:萌小白
一个热爱网络的青年!

发布评论

表情