R语言学习系列09-自定义函数与apply函数族
- 格式:docx
- 大小:152.41 KB
- 文档页数:7
掌握R语言中的apply函数族前言刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算。
那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言本身来实现的,而向量操作是基于底层的C语言函数实现的,从性能上来看,就会有比较明显的差距了。
那么如何使用C的函数来实现向量计算呢,就是要用到apply的家族函数,包括apply, sapply, tapply, mapply, lapply, rapply, vapply, eapply等。
目录1.apply的家族函数2.apply函数pply函数4.sapply函数5.vapply函数6.mapply函数7.tapply函数8.rapply函数9.eapply函数1. apply的家族函数apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环、分组、过滤、类型控制等操作。
但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全不一样的,所以apply函数族一直是使用者玩不转的一类核心函数。
很多R语言新手,写了很多的for循环代码,也不愿意多花点时间把apply函数的使用方法了解清楚,最后把R代码写的跟C似得,作者严重鄙视只会写for的R程序员。
apply函数本身就是解决数据循环处理的问题,为了面向不同的数据类型,不同的返回值,apply函数组成了一个函数族,包括了8个功能类似的函数。
这其中有些函数很相似,有些也不是太一样的。
一般最常用的函数为apply和sapply,下面将分别介绍这8个函数的定义和使用方法。
2. apply函数apply函数是最常用的代替for循环的函数。
apply函数可以对矩阵、数据框、数组(二维、多维),按行或列进行循环计算,对子元素进行迭代,并把子元素以参数传递的形式给自定义的FUN函数中,并以返回计算结果。
r function函数R语言是一种广泛使用的开源编程语言,用于数据分析、统计建模和可视化。
在R语言中,函数是一种非常重要的概念,它允许用户将一段代码封装成一个可重复使用的模块。
本文将介绍R语言中的函数及其应用。
1. 函数定义在R语言中,函数定义使用关键字function。
一个简单的函数定义如下:```my_function <- function(x) {y <- x^2return(y)}```上述代码定义了一个名为my_function的函数,它接受一个参数x,并返回x的平方。
在函数体内部,可以编写任意数量的代码行。
2. 函数调用要调用一个函数,只需要使用函数名并传递必要的参数即可。
例如,在上述示例中,要计算3的平方,可以使用以下代码:```result <- my_function(3)```这将把9赋值给变量result。
3. 函数参数在R语言中,函数可以有零个或多个参数。
例如,在下面这个示例中,我们定义了一个带有两个参数(x和y)的函数:```add_numbers <- function(x, y) {z <- x + yreturn(z)}```该函数将传递给它的两个参数相加,并返回结果。
4. 默认参数值在R语言中,可以为函数参数指定默认值。
如果不传递该参数,则使用默认值。
例如,在下面这个示例中,我们定义了一个带有一个默认参数值的函数:```greet <- function(name = "World") {message <- paste("Hello", name)print(message)}```如果不传递任何参数,则该函数将打印“Hello World”。
如果传递一个参数,则该函数将使用传递的名称打印一条消息。
5. 可变数量的参数在R语言中,可以定义一个可变数量的参数。
这些参数用三个点(...)表示。
r语言自定义函数编写格式-回复R语言是一种开源的编程语言,被广泛应用于数据分析和统计建模等领域。
除了提供大量的内置函数外,R语言还支持用户自定义函数,以便更好地适应特定的编程需求。
本文将介绍R语言中自定义函数的编写格式,并以此为主题,逐步解释。
自定义函数是指用户自行编写的操作序列,可以接受输入参数并返回相应的结果。
通过使用自定义函数,我们可以将一系列重复的操作封装起来,以提高代码的可复用性和可读性。
首先,我们需要使用关键字"function"定义一个函数。
函数定义的基本格式如下:function_name <- function(arguments) {# 函数体# 可以包含一系列的操作# 并通过return语句返回结果}在函数定义中,function_name代表函数的名称,arguments是函数的输入参数。
我们可以根据实际需求,定义一个或多个输入参数,并在函数体中使用它们。
函数体是函数的核心部分,用于实现具体的功能。
在函数体中,我们可以使用R语言的内置函数、控制结构、变量等。
在函数体中,我们可以使用return语句来返回结果。
return语句用于将函数的执行结果返回给调用者。
例如,我们可以使用return语句返回计算结果,或者返回一个处理后的数据集。
如果没有显式地使用return语句,函数将返回最后一行执行的表达式作为结果。
在定义函数时,我们可以为输入参数指定默认值。
通过为输入参数设置默认值,我们可以在调用函数时省略这些输入参数,而使用默认值。
例如,我们可以定义一个计算平方的函数,其中输入参数的默认值设置为2:square <- function(x = 2) {return(x^2)}在调用函数时,如果不指定输入参数的值,函数将使用默认值进行计算。
例如,square()将返回4,而square(3)将返回9。
除了定义输入参数和设置默认值外,我们还可以定义变量作为函数的局部变量。
R语言里面的apply()家族简述我能想到的所有套路,毒液里面都有。
这个教程目的在于介绍apply()家族在R语言的用法,apply()函数算是R语言里面很基础的一个函数,同时还有sapply()、lapply()、tapply()函数精简了apply()的用法。
apply()函数是一个很R语言的函数,可以起到很好的替代冗余的for循环的作用,在一篇博客里面介绍过,R语言的循环操作for和while,都是基于R语言本身来实现的,而向量操作是基于底层的C语言函数实现的,所以使用apply()家族进行向量计算是高性价比的。
apply()可以面向数据框、列表、向量等,同时任何函数都可以传递给apply()函数。
apply()函数apply()函数的用法如下:apply(X, MARGIN, FUN)Here:-x: 一个数组或者矩阵-MARGIN: 两种数值1或者2决定对哪一个维度进行函数计算-MARGIN=1`: 操作基于行-MARGIN=2`: 操作基于列-MARGIN=c(1,2)`: 对行和列都进行操作-FUN: 使用哪种操作,内置的函数有mean(平均值)、medium (中位数)、sum(求和)、min(最小值)、max(最大值),当然还包括广大的用户自定义函数一个最简单的例子就是使用apply()对一个matrix求和,以下代码是对列求和:> m1 <- matrix(C<-(1:10),nrow=5, ncol=6)> m1[,1] [,2] [,3] [,4] [,5] [,6][1,] 1 6 1 6 1 6[2,] 2 7 2 7 2 7[3,] 3 8 3 8 3 8[4,] 4 9 4 9 4 9[5,] 5 10 5 10 5 10> a_m1 <- apply(m1, 2, sum)> a_m1[1] 15 40 15 40 15 40lapply()函数lapply()函数中多出来的l代表的是list,所以lapply()和apply()的区别在于输出的格式,lapply()的输出是一个列表(list),所以lapply()函数不需要MARGIN参数:lapply(X, FUN)Arguments:-X: 一个向量或者是一个对象-FUN: 对X里面每个元素进行操作的函数一个很简单的示例操作就是把一个字符向量里面的字符转成小写:> movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN") > class(movies)[1] "character"> movies_lower <-lapply(movies, tolower)> str(movies_lower)List of 4$ : chr "spyderman"$ : chr "batman"$ : chr "vertigo"$ : chr "chinatown"我们可以看到,输出的内容是以list形式给出的,为了方便,我们可以使用unlist()函数进行整合:> movies_lower <-unlist(lapply(movies,tolower))> str(movies_lower)chr [1:4] "spyderman" "batman" "vertigo" "chinatown" sapply()函数sapply()函数做的事情和lapply()一样,可以理解为是一个简化的lapply,返回的是一个向量(vector)使得对解读更加友好,其使用方法和lapply一样,不过多了两个参数: simplify&s,simplify = T可以将输出结果数组化,如果设置为false,sapply()函数就和lapply()函数没有差别了,s = T可以设置字符串为字符名。
c函数r语言摘要:1.函数与R 语言简介2.R 语言中常用的函数类型3.函数的参数与返回值4.自定义函数与匿名函数5.函数在数据处理与分析中的应用正文:R 语言是一种功能强大的编程语言,广泛应用于数据处理、统计分析和可视化等领域。
在R 语言中,函数是一段可重复使用的代码,可以简化代码编写,提高工作效率。
本文将介绍R 语言中函数的基本概念、类型以及应用。
1.函数与R 语言简介R 语言是一种基于Bell 实验室的S 语言的编程语言,拥有丰富的函数库和强大的数据处理能力。
在R 语言中,函数是一段可重复使用的代码,通过调用函数名并传递参数,可以实现特定功能。
2.R 语言中常用的函数类型R 语言中的函数类型主要有两种:内置函数和自定义函数。
(1) 内置函数:R 语言提供了丰富的内置函数,涵盖了数据处理、统计分析、绘图等多个领域。
这些函数无需额外安装,可以直接在R 中调用。
(2) 自定义函数:用户可以根据自己的需求编写自定义函数,实现特定的功能。
自定义函数可以提高代码的复用性,降低编程难度。
3.函数的参数与返回值R 语言中的函数通过参数传递数据,实现特定功能。
函数可以有输入参数(input arguments)和输出参数(output arguments)。
输入参数在函数定义中用括号表示,而输出参数用箭头表示。
例如,`mean`函数的定义为`mean(x, ...)`,其中`x`是输入参数,表示要计算平均值的数据向量,而`...`表示可选择的输出参数,用于返回描述统计信息。
4.自定义函数与匿名函数自定义函数是通过`function`关键字定义的函数,可以实现特定功能。
例如,定义一个计算平方的函数:```Rsquare <- function(x) {x * x}```匿名函数是一种简化版的自定义函数,可以快速实现简单的功能。
匿名函数不需要显式定义函数名,直接使用函数表达式即可。
例如:```Rsquare <- function(x) x * x```5.函数在数据处理与分析中的应用在R 语言中,函数广泛应用于数据处理和分析。
r语言apply在R语言中,apply系列函数可以对向量、矩阵、数据框一次性对整体数据应用函数运算,非常方便一、apply()函数定义:apply()函数按矩阵的行或列方向应用指定函数。
apply(x # 数组或矩阵MARGIN #应用函数的方向,1行2列FUN # 应用的函数)# 返回值根据数据Data的数据类型与Fun的返回值自动判断返回的数据类型这里举个例子:s <- matrix(1:9,ncol = 3)apply(s,1,sum)apply(s,2,sum)即可得到下列结果:apply(s,1,sum)[1] 12 1518apply(s,2,sum)[1] 6 15 24在举一个R语言自带的鸢尾花数据集例子:结果如下:apply(iris[,1:4],2,sum)Sepal.Length Sepal.WidthPetal.Length Petal.Width 876.5 458.6 563.7 179.9如果小伙伴们对鸢尾花数据集不了解可以输入iris查看。
于此同时R语言中还定义了rowSums(),rowMeans(),colSums(),colMeans()函数对行列进行求和、均值的函数。
使用方式也很简单。
二、lapply()函数定义:lapply()函数以列表的形式返回函数的结果lapply(X #向量、列表、表达式、数据库FUN #应用的函数... #额外参数,会被传递给fun函数)继续使用鸢尾花数据集举例:结果如下:lapply(iris[,1:4],mean)$Sepal.Length[1]5.843333$Sepal.Width[1] 3.057333$Petal.Length[1] 3.758$Petal.Width[1] 1.199333可以看到结果以列表的形式返回,可以使用unlist()函数将结果转换为向量。
unlist(#将列表转换为向量X #R对象recursive = FALSE #是否对x中的列表进行递归转换s = TRUE #是否保留列表中的值名称)unlist(lapply(iris[,1:4],mean))结果如下所示:unlist(lapply(iris[,1:4],mean))Sepal.LengthSepal.WidthPetal.Length Petal.Width 5.843333 3.057333 3.758000 1.199333三、sapply()函数sapply()函数与lapply()函数类似,其结果以矩阵、向量的数据类型返回。
apply函数族_光环大数据培训机构R语言apply系列函数的基本作用是对数组(array,可以是多维)或者列表(list)按照元素或元素构成的子集合进行迭代,并将当前元素或子集合作为参数调用某个指定函数。
vector是一维的array,dataframe可以看作特殊的list。
作用目标在每个元素上应用在子集合上应用arrayapplytapplylistlapply (…)by其中 lapply(…) 为一族函数,包括简化版: sapply,递归版: rapply。
其中sapply又可分为可设置返回值模板vapply和多变量版mapply。
另外vector 比较特殊,vector是一维的array,但是却不全是和array使用相同的函数。
在按元素迭代的情况下,使用和list一样的 lapply 函数;而在按子集合迭代的情况下, tapply 和 by 都能用,只是返回值形式不同。
1. apply函数在array上,沿margin方向,依次调用 FUN,返回结果通常为Array类型,如果返回值的向量长度不等,则返回List对象。
margin表示数组引用的第几维下标(即array[index1, index2, …]中的第几个index),margin = 1表示行,2表示列,c(1,2) 表示行和列。
– 举例1:# 二维矩阵对象x <- cbind(x1 = 3, x2 = c(4:1, 2:5))dimnames(x)[[1]] <- letters[1:8]apply(x, 2, mean, trim = .2)apply(x, 1, mean, trim = .2)apply(x, 2, sort)– 举例2:#三维数组对象,数据向量中的值被赋给数组中的值时,将遵循“主列顺序”,即第一个下标变化最快,最后的下表变化最慢。
r语言 applyapply的本义是指“将甲物置于乙物之上”,现代英语中仍保留“粘贴”的意思,并由此引申表示将某物“应用”或“运用”于另一物使之发挥或取得实际效益。
apply作“敷,涂”解时,是正式用法,及物动词仅用于说明书中。
在会话中和大多数文字中,则代之以put 〔rub〕 it on, rub〔spread〕 it in。
表示“把…敷〔涂〕在…之上”可说apply sth to...。
apply后可接药物、油漆、冰块等作宾语,而to的宾语可以是物,也可以是人体的某个部位。
apply作“应用领域,采用”解时,也就是及物动词,可至规章、条例、精力、经验、用心、智力等作宾语; to的宾语即可就是人,也可是物或事。
apply后还可接反身代词作宾语,表示“把(精力等)投入到…”,其后一般接带介词to 引起的短语。
不用于被动结构,也不用于进行时态。
apply作“适用于”解时,指理论、原则等适用于,仅用做不及物动词。
apply作“申请”解时是不及物动词,常用于“apply to...for...”结构表示“向…申请…”,介词to的宾语可以是人或组织机构, for的宾语可以是物或职位等。
apply还可以则表示亲自或用信件轻易向掌权者命令同意其建议或提出申请。
1. investors can apply for a package of shares at a set price.投资者可以赎回固定价格的股票女团。
2. you will need to apply three coats of varnish.须要刷三层清漆。
3. the right thing would be to apply direct pressure to the wound.恰当的作法就是轻易握住伤口。
4. priority will be given to those who apply early.晚申请者将荣获优先考量。
数据分析工具R语言的高级使用方法数据分析是当今社会中非常重要的一项技能,而对于数据科学家和数据分析师来说,熟练掌握数据分析工具R语言的高级使用方法是必不可少的。
本文将介绍R语言中一些常用且功能强大的高级使用方法,帮助读者更好地利用R语言进行数据分析。
一、函数式编程R语言是一种函数式编程语言,函数是R语言中的核心概念之一。
函数式编程的一个重要特点是函数的复用,通过将常用的功能封装成函数,可以提高代码的可读性和重用性。
在R语言中,可以使用自定义函数和匿名函数。
自定义函数是使用"function"关键字定义的函数,可以接受输入参数和返回结果。
例如,我们可以定义一个计算平均值的函数:```get_average <- function(x) {mean(x)}```匿名函数则是没有函数名的函数,通常用于对某个数据集进行快速操作,常与函数式编程中的apply类函数结合使用。
例如,我们可以使用匿名函数对一个向量中的每个元素进行平方操作:```squared <- sapply(1:10, function(x) x^2)```二、向量化操作在R语言中,向量是一种常见的数据结构,可以包含多个元素。
与其他编程语言不同的是,在R语言中进行向量化操作可以大大提高代码的效率。
R语言提供了许多有用的向量化函数,如"apply"、"sapply"、"lapply"等,可以对向量进行快速操作。
例如,我们可以使用"apply"函数对矩阵的每一行进行求和操作:```matrix <- matrix(1:10, nrow = 2)row_sums <- apply(matrix, 1, sum)```除了使用内置的向量化函数,还可以使用R语言中的"Vectorize"函数将一个普通函数转换为向量化函数。
09. 自定义函数与apply函数族
一、自定义函数
1.R语言中,自定义函数的基本格式为:
myfun<-function(arglist){
statements
return(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("the input data must be numeric! \n")
}
if(length(x)==1){
stop("can not compute std for one number,
a numeric vector required. \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.974921
> std2(3) #输入数据为1个数值,异常处理机制报错
Error in std2(3) : can not compute std for one number,
a numeric vector required.
> std2(c("1","2")) #输入数据不是数值型,异常处理机制报错
Error in std2(c("1", "2")) : the input data must be num eric!
或者创建并运行脚本文件:(选中代码,点run按钮)
二、apply函数族
R语言中,利用apply族函数可将某函数作用到一系列数据对象上,包括标量、向量、矩阵、多维数组、数据框、列表。
1. 函数apply()
对数据对象的一个维度,都作用上某函数,生成列表、多维数组或向量。
基本格式为:
apply(x, MARGIN=..., fun, ...)
其中,x为数据对象(矩阵、多维数组、数据框);MARGIN=1表示按行,2表示按列;fun表示要作用的函数。
>x<-matrix(1:6,ncol=2)
>x
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
>apply(x,1,mean) #按行求均值
[1] 2.5 3.5 4.5
>apply(x,2,mean) #按列求均值
[1] 2 5
2. 函数lapply()
对数据对象的每一个元素,都作用上某函数,生成一个与元素个数相同的值列表。
基本格式为:
lapply(x, fun, ...)
其中,x为数据对象(列表、数据框、向量)。
>x<-list(a=1:5,b=exp(0:3))
>x
$a
[1] 1 2 3 4 5
$b
[1] 1.000000 2.718282 7.389056 20.085537
>lapply(x,mean)
$a
[1] 3
$b
[1] 7.798219
3. 函数sapply()
基本格式为:
lapply(x, fun, ..., simplify=TRUE, S=...)
比函数lapply()多了一个参数simplify,若simplify=FALSE,则同lapply();若为TRUE,则将输出的list简化为向量或矩阵;若S为TRUE,且x为字符型,则用x作为结果的名称。
>sapply(x, mean, simplify = TRUE) #x同上例
a b
3.000000 7.798219
>list<-list(c("a","b","c"),c("A","B","C"))
>list
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "A" "B" "C"
#将列表list中的元素与数字1~3连接
>sapply(list,paste, 1:3, simplify = TRUE)
[,1] [,2]
[1,] "a 1" "A 1"
[2,] "b 2" "B 2"
[3,] "c 3" "C 3"
>sapply(list,paste, 1:3, simplify = FALSE)
[[1]]
[1] "a 1" "b 2" "c 3"
[[2]]
[1] "A 1" "B 2" "C 3"
4. 函数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的均值
F M
166.3333 175.5000
5. 函数mapply()
是函数sapply()的多变量版本,将对多个变量的每个参数作用某函数。
基本格式为:
mapply(fun, MoreArgs=NULL, SIMPLIFY=TRUE, S=TRUE)其中,MoreArgs为fun函数的其它参数列表;SIMPLIFY为逻辑值或字符串,取值为TRUR时,将结果转化为一个向量、矩阵或高维阵
列(但不是所有结果都可转化)。
>#重复生成列表list(x=1:2), 重复次数times=1:3,结果为列表
>mapply(rep, times=1:3, MoreArgs = list(x=1:2))
[[1]]
[1] 1 2
[[2]]
[1] 1 2 1 2
[[3]]
[1] 1 2 1 2 1 2
>#重复生成列表list(x=1:2), 重复次数times=c(2,2),结果为矩阵>mapply(rep, times=c(2,2), MoreArgs = list(x=1:2))
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2
主要参考文献:
[1]张良均,谢佳标,杨坦,肖刚. R语言与数据挖掘. 机械工业出版
社,2016.。