前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R|apply,tapply

R|apply,tapply

作者头像
生信补给站
发布2020-08-06 10:38:31
6710
发布2020-08-06 10:38:31
举报
文章被收录于专栏:生信补给站生信补给站

apply族功能强大,实用,可以代替很多循环语句,先简单介绍apply和tapply函数。

一、apply()函数

apply函数可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。使用格式如下:

代码语言:javascript
复制
apply(x, MARGIN, FUN, ...)

其中x为数据对象,MARGIN是维度的下标,FUN是由你指定的函数,而...则包括了任何想传递给FUN的参数。在矩阵或数据框中, MARGIN=1表示行, MARGIN=2表示列。

示例如下:

代码语言:javascript
复制
set.seed(100)mydata <- matrix(rnorm(30), nrow=6) #生成随机数mydata            [,1]        [,2]        [,3]       [,4]       [,5]
[1,] -0.50219235 -0.58179068 -0.20163395 -0.9138142 -0.8143791
[2,]  0.13153117  0.71453271  0.73984050  2.3102968 -0.4384506
[3,] -0.07891709 -0.82525943  0.12337950 -0.4380900 -0.7202216
[4,]  0.88678481 -0.35986213 -0.02931671  0.7640606  0.2309445
[5,]  0.11697127  0.08988614 -0.38885425  0.2619613 -1.1577295
[6,]  0.31863009  0.09627446  0.51085626  0.7734046  0.2470760

利用apply求均值

代码语言:javascript
复制
apply(mydata, 2, mean)[1]  0.1454680 -0.1443698  0.1257119  0.4596365 -0.4421267apply(mydata, 2, mean, trim=0.2) #去掉端值[1]  0.1220539 -0.1888731  0.1008213  0.3403341 -0.4355267

注:FUN可为任意R函数,这也包括你自行编写的函数。

二、tapply()函数

tapply()函数可根据因子、向量和要计算的函数计算,使用格式如下:

代码语言:javascript
复制
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE) 

其中X通常是一向量;INDEX是一个list对象,且该list中的每一个元素都是与X有同样长度的因子;FUN是需要计算的函数;simplify是逻辑变量,若取值为TRUE(默认值),且函数FUN的计算结果总是为一个标量值,那么函数tapply返回一个数组;若取值为FALSE,则函数tapply的返回值为一个list对象。

示例如下:

代码语言:javascript
复制
Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose","David Jones", "Janice Markhammer", "Cheryl Cushing","Reuven Ytzrhak", "Greg Knox", "Joel England","Mary Rayburn")Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)English <- c(25, 22, 18, 15, 20, 28, 15, 30, 27, 18)roster <- data.frame(Student, Math, English,stringsAsFactors=FALSE)
roster$grade[roster$Math <= 500] <- "A"roster$grade[roster$Math > 500] <- "B"
roster             Student Math English grade         John Davis  502      25     B    Angela Williams  600      22     B   Bullwinkle Moose  412      18     A        David Jones  358      15     A  Janice Markhammer  495      20     A     Cheryl Cushing  512      28     B     Reuven Ytzrhak  410      15     A          Greg Knox  625      30     B       Joel England  573      27     B       Mary Rayburn  522      18     B

1)应用前面的apply求数学和英语的平均分

代码语言:javascript
复制
apply(roster[,c(2,3)],2,mean)Math English   500.9    21.8 

2)当需要分组计算时候,使用tapply函数

代码语言:javascript
复制
tapply(roster[,"English"], roster[,"grade"], mean) A  B 17 25 

注:当index不是因子时,可以用as.factor()把参数强制转换成因子

3)aggregate函数同样可以得到类似的结果:

代码语言:javascript
复制
aggregate(x=roster[c('English')], by = list(roster$grade), FUN=mean)

4)实现类似excel的透视表功能

代码语言:javascript
复制
attach(roster)tapply(English,list(Student,grade),mean)                    A  BAngela Williams   NA 22Bullwinkle Moose  18 NACheryl Cushing    NA 28David Jones       15 NAGreg Knox         NA 30Janice Markhammer 20 NAJoel England      NA 27John Davis        NA 25Mary Rayburn      NA 18Reuven Ytzrhak    15 NA

以上,apply,tapply可以省去很多循环的分析,其他apply族函数,待续。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信补给站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档