R语言中apply函数家族

来源:互联网 发布:云杉网络 nsp 编辑:程序博客网 时间:2024/06/04 18:19

apply

简单说明:对数组或者矩阵的一个维度使用函数生成值得到列表或者数组、向量。

语法规则:apply(X, MARGIN, FUN, ...)简单释义:X:阵列,包括矩阵MARGIN:1表示矩阵行,2表示矩阵列,也可以是c(1,2)FUN:自定义函数

示例:

#构建4*5的矩阵,按行排列mat<-matrix(data = 1:20,nrow = 4,byrow = T)#计算矩阵每列的均值apply(X = mat,MARGIN = 1,FUN = mean)

结果:

[1]  3  8 13 18

lapply

简单说明:通过对x的每一个元素运用函数,生成一个与元素个数相同的值列表。

语法规则:lapply(X, FUN, ...)简单释义:X:表示一个向量或者表达式对象,其余对象将被通过as.list强制转换为list

示例:

x<-list(a=1:20,b=exp(-3:3),c=c(T,T,F,F,T))#获取列表中每个元素的长度lapply(x,FUN = length)

结果:

$a[1] 20$b[1] 7$c[1] 5

sapply

简单说明:用户友好版本,是lapply函数的包装版,该函数返回结果是向量或者矩阵,如果simplify=“array”,且合适的情况下,将会通过simplify2array()函数转换为阵列。

语法规则:sapply(X, FUN, ..., simplify = TRUE, USE.NAMES =TRUE)简单释义:X:向量或者表达式对象,其余对象将会通过as.list强制转换为listsimplify:逻辑值或者字符串,默认值为TRUE,若合适将返回一个向量或者矩阵,如果simply="array",结果将返回一个阵列。USE.NAMES为逻辑值,如果为TRUE,且x没有被命名,则对x进行命名。

示例:

#查看iris数据集的模式和类sapply(iris,mode)sapply(iris,class)#命名k<-c('a','b','c')sapply(k,FUN = paste,simplify = F,USE.NAMES = F,1:5)

结果:

> sapply(iris,mode)Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species    "numeric"    "numeric"    "numeric"    "numeric"    "numeric" > sapply(iris,class)Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species    "numeric"    "numeric"    "numeric"    "numeric"     "factor" > k<-c('a','b','c')> sapply(k,FUN = paste,simplify = F,USE.NAMES = F,1:5)[[1]][1] "a 1" "a 2" "a 3" "a 4" "a 5"[[2]][1] "b 1" "b 2" "b 3" "b 4" "b 5"[[3]][1] "c 1" "c 2" "c 3" "c 4" "c 5"

vapply

简单说明:和sapply函数类似,但是返回值有预定义类型,使用起来更加安全。

语法规则:vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)简单释义:X:向量或者表达式对象,其余对象将被通过as.list强制转换为listFUN.VALUE:一个通用型向量,FUN函数返回值的模板simplify:逻辑值或者字符串,结果应该被简化为向量、矩阵或者高维数组。必须是命名的,不能是简写。默认值是TRUE,若合适将会返回一个向量或者矩阵。如果simplify="array",结果将返回一个阵列。USE.NAMES:逻辑值,如果为TRUE,且x没有被命名,则对x进行命名。

示例:

#构建数据框dat<-data.frame(a=rnorm(100,1,2),b=rnorm(100,1,1),c=rnorm((100,1,3)))#计算数据框中每个向量的均值vapply(dat,mean,FUN.VALUE = c(mean=0))#自定义函数计算均值和标准差FUN<-function(x){  list(mean(x),sd(x))}vapply(dat,FUN,FUN.VALUE = list(mean=0,sd=0))

结果:

> dat<-data.frame(a=rnorm(100,1,2),b=rnorm(100,1,1),c=rnorm(100,1,3))> vapply(dat,mean,FUN.VALUE = c(mean=0))        a         b         c 0.8872571 1.0363621 0.9981886 > > FUN<-function(x){+   list(mean(x),sd(x))+ }> vapply(dat,FUN,FUN.VALUE = list(mean=0,sd=0))     a         b         c        mean 0.8872571 1.036362  0.9981886sd   1.900742  0.8051695 3.141448 

tapply

简单说明:对不规则阵列使用向量,即对一组非空值按照一组确定因子进行相应计算。

语法规则:tapply(X, INDEX, FUN, ..., simplify = TRUE)简单释义:x:是一个向量INDEX:因子列表,和x长度一样,元素将被通过as.factor强制转换为因子

示例:

age<-c(60,54,86,47,58,86)sex<-c("M","M","F","M","M","F")tapply(age, sex,FUN = mean)

结果:

    F     M 86.00 54.75 

mapply

简单说明:是sapply的多变量版本。将对…中的每个参数运行FUN函数,如有必要,参数将被循环。该函数的第一个参数为指定的函数,第二个参数为指定函数的参数。

语法规则:mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)简单释义:MoreArgs:FUN函数的其他参数列表SIMPLIFY:逻辑或者字符串,可以减少结果成为一个向量、矩阵或者更高维阵列USE.NAMES:逻辑值,如果第一个参数...已被命名,将使用这个字符向量作为名字

示例:

#针对1 2 3 4分别重复4 3 2 1次mapply(FUN = rep,1:4,4:1)#寻找字符串中字母和数值紧密相连的字符并截取char<-c("d12jsfl","df13djklf","sd5jglkjg","djf2dlk")result<-gregexpr(pattern = '[a-z][0-9]',char)fun<-function(x,y){  substring(x,y,y+attr(y,'match.length')-1)}mapply(fun,char,result)

结果:

> mapply(FUN = rep,1:4,4:1)[[1]][1] 1 1 1 1[[2]][1] 2 2 2[[3]][1] 3 3[[4]][1] 4> char<-c("d12jsfl","df13djklf","sd5jglkjg","djf2dlk")> result<-gregexpr(pattern = '[a-z][0-9]',char)> fun<-function(x,y){+   substring(x,y,y+attr(y,'match.length')-1)+ }> mapply(fun,char,result)  d12jsfl df13djklf sd5jglkjg   djf2dlk      "d1"      "f1"      "d5"      "f2" 

总结:

apply()的被分析对象必须且只能是矩阵或数组tapply()的被分析对象必须且只能是向量sapply()的被分析对象必须且只能是向量或列表lapply()的被分析对象必须且只能是向量或列表vapply()的被分析对象必须且只能是向量或列表mapply()的被分析对象必须是函数

声明:
本博文始发于微信公众号:砍柴问樵夫
想了解更多内容请关注:
这里写图片描述

1 0
原创粉丝点击