09.自定义函数与apply函数族一、自定义函数1.R语言中,自定义函数的基本格式为:myfun-function(arglist){statementsreturn(object)}其中,myfun为函数名称;arglist为参数列表;大括号中的部分为函数体。函数体通常包含三部分:(1)异常处理输入的数据不能满足函数计算的要求,或者类型不符,应设计异常处理机制提示哪个地方出现错误;(2)内部处理过程包括具体的内部处理步骤,与该函数要完成的功能有关;(3)返回值用函数return()给出,返回对象的类型是任意的;函数在内部处理过程中,一旦遇到return()就会终止运行函数体,将return()内的数据作为函数处理的结果返回。2.自定义函数及调用实例操作下面自定义函数计算标准差:(1)先在RStudio的代码编辑窗口编写函数,并保存为E:\办公资料\R语言\R语言学习系列\codes\std2.R##计算标准差std2-function(x){#异常处理if(!is.numeric(x)){stop(theinputdatamustbenumeric!\n)}if(length(x)==1){stop(cannotcomputestdforonenumber,anumericvectorrequired.\n)}result-sqrt(sum((x-mean(x))^2)/(length(x)-1))return(result)}(2)调用std2.R要调用创建好的函数,在命令控制台窗口,先使用source(std2.R,encoding=utf-8)注意改到当前路径;若不加encoding=utf-8将弹出警告信息。再调用函数即可。setwd(E:/办公资料/R语言/R语言学习系列/codes)source(std2.R,encoding=utf-8)std2(c(2,6,4,9,12))[1]3.974921std2(3)#输入数据为1个数值,异常处理机制报错Errorinstd2(3):cannotcomputestdforonenumber,anumericvectorrequired.std2(c(1,2))#输入数据不是数值型,异常处理机制报错Errorinstd2(c(1,2)):theinputdatamustbenumeric!或者创建并运行脚本文件:(选中代码,点run按钮)二、apply函数族R语言中,利用apply族函数可将某函数作用到一系列数据对象上,包括标量、向量、矩阵、多维数组、数据框、列表。表1apply函数族常用函数函数名称作用对象返回结果apply()矩阵、多维数组、数据框向量、多维数组、列表lapply()列表、数据框、向量列表sapply()列表、数据框、向量向量、多维数组、列表tapply()不规则阵列阵列mapply()多个列表、多个向量列表1.函数apply()对数据对象的一个维度,都作用上某函数,生成列表、多维数组或向量。基本格式为:apply(x,MARGIN=...,fun,...)其中,x为数据对象(矩阵、多维数组、数据框);MARGIN=1表示按行,2表示按列;fun表示要作用的函数。x-matrix(1:6,ncol=2)x[,1][,2][1,]14[2,]25[3,]36apply(x,1,mean)#按行求均值[1]2.53.54.5apply(x,2,mean)#按列求均值[1]252.函数lapply()对数据对象的每一个元素,都作用上某函数,生成一个与元素个数相同的值列表。基本格式为:lapply(x,fun,...)其中,x为数据对象(列表、数据框、向量)。x-list(a=1:5,b=exp(0:3))x$a[1]12345$b[1]1.0000002.7182827.38905620.085537lapply(x,mean)$a[1]3$b[1]7.7982193.函数sapply()基本格式为:lapply(x,fun,...,simplify=TRUE,USE.NAMES=...)比函数lapply()多了一个参数simplify,若simplify=FALSE,则同lapply();若为TRUE,则将输出的list简化为向量或矩阵;若USE.NAMES为TRUE,且x为字符型,则用x作为结果的名称。sapply(x,mean,simplify=TRUE)#x同上例ab3.0000007.798219list-list(c(a,b,c),c(A,B,C))list[[1]][1]abc[[2]][1]ABC#将列表list中的元素与数字1~3连接sapply(list,paste,1:3,simplify=TRUE)[,1][,2][1,]a1A1[2,]b2B2[3,]c3C3sapply(list,paste,1:3,simplify=FALSE)[[1]][1]a1b2c3[[2]][1]A1B2C34.函数tapply()对不规则阵列,对照一组确定因子作用某函数。基本格式为:tapply(x,INDEX,fun,...,simplify=TRUE)其中,x通常为向量;INDEX为与x长度相同的因子列表(若不是因子,R会强制转化为因子);simplify=TRUE且fun计算结果为标量值,则返回值为数组,若为FALSE,则返回值为list对象。height-c(174,165,180,171,160)sex-c(F,F,M,M,F)tapply(height,sex,mean)#计算不同sex对应的height的均值FM166.3333175.50005.函数mapply()是函数sapply()的多变量版本,将对多个变量的每个参数作用某函数。基本格式为:mapply(fun,MoreArgs=NULL,SIMPLIFY=TRUE,USE.NAMES=TRUE)其中,MoreArgs为fun函数的其它参数列表;SIMPLIFY为逻辑值或字符串,取值为TRUR时,将结果转化为一个向量、矩阵或高维阵列(但不是所有结果都可转化)。#重复生成列表list(x=1:2),重复次数times=1:3,结果为列表mapply(rep,times=1:3,MoreArgs=list(x=1:2))[[1]][1]12[[2]][1]1212[[3]][1]121212#重复生成列表list(x=1:2),重复次数times=c(2,2),结果为矩阵mapply(rep,times=c(2,2),MoreArgs=list(x=1:2))[,1][,2][1,]11[2,]22[3,]11[4,]22主要参考文献:[1]张良均,谢佳标,杨坦,肖刚.R语言与数据挖掘.机械工业出版社,2016.