第13天 apply族函数的应用 1. 函数apply() 对数据对象的一个维度,都作用上某函数,生成列表、多维数组或向量。基本格式为: apply(x, MARGIN=..., fun, ...) 其中,x为数据对象(矩阵、多维数组、数据框);MARGIN=1表示按行,2表示按列;fun表示要作用的函数。 通常来说,apply函数经常用来计算矩阵中行或列的均值、和值的函数。 > 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为数据对象(列表、数据框、向量)。 lapply对每列进行操作,非常适合数据框;在R中数据框是一种特殊的列表,所以数据框的列也将作为函数的处理对象。 > 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, USE.NAMES=...) 比函数lapply()多了一个参数simplify,若simplify=FALSE,则同lapply();若为TRUE,则将输出的list简化为向量或矩阵;若USE.NAMES为TRUE,且x为字符型,则用x作为结果的名称。 simplify=F:返回值的类型是list,此时与lapply完全相同 simplify=T(默认值):返回值的类型由计算结果定,如果函数返回值长度为1,则sapply将list简化为vector; > 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对象。 x是需要处理的向量,INDEX是因子(因子列表),FUN是需要执行的函数,simplify指是否简化输入结果(考虑sapply对于lapply的简化) x可以是数据库的一个变量,也可以是单独的向量。 > 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, 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] 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 6. 医学数据分析中apply族的应用 对于医学数据而言,实际上很多情况我们不太会把所有的行,或者所有的列求一个均数或者求一个中位数,但是其它函数就会用的比较多。比如,我们要看看各个变量的缺失值数据,比如把很多数值变量因子化。 我们先导入数据库elder1和elder2 t1<-read_csv("elder1.csv") t2<-read_csv("elder2.csv") 查看变量的类型 sapply(t1,class) 是不是都是数字变量呢 sapply(t1,is.numeric) 把部分变量转为因子 vars<-c(“sex”,”marriage”,”education”,”huji”,”income”,”smoking”) t2[vars] <- lapply(t2[vars], factor) 分组计算均数 tapply(t2$health,t2$sex,mean, na.rm = TRUE) 分组计数 tapply(t2$marriage,t2$sex,table) 看看到底各变量有多少缺失值 naf<-function(x){ nas<-sum(is.na(x)) return(nas) } apply(t1,2, naf) 这段程序就是自编与apply族函数的联合。光apply族函数无法直接计算每一个变量的缺失值个数,但是我们用自编函数把is.na ()和sum()进行整合,形成新的函数naf,那么我们就可以进行批量操作了。 Apply族函数无论是在变量转换、数据统计描述甚至是统计分析,都具有一定的价值。它的批量作业法使它变成R语言非常重要系列函数。 DAY13的内容就介绍到这里! 最后,一个月就能学会R语言,你敢挑战一下吗? 想挑战的话,请加入R语言的交流群吧?(由于群规模限制,请先加入郑老师微信号:扫描以下二维码,并注明R语言)
|
|