apply函数族+split+by

引用自R语言向量化运算之apply函数族+split+byhttps://blog.csdn.net/qq_38984677/article/details/81676556

apply函数族包括

apply(),lapply(),sapply(),vapply(),mapply(),rapply(),tapply(),在实际应用中需要依据不同数据结构和数据处理目的采用不同的函数。

1.apply函数

apply(x, margin, 指定的函数, ...)
可以将任意一个函数应用到数组或矩阵(所有数据必须同一类型)的任何维度上,...包含了任何能传递到fun的参数,margin=1表示行,margin=2表示列,margin=c(1,2)表示同时以行和列为单位进行计算,返回向量或矩阵
apply(tian,2,mean,trim=0.2) #计算每列的截尾均值

2.lapply和sapply函数

两个函数都可用于处理list\vector\array\matrix\data.frame类型数据,但lapply()返回list数据类型,其他方面两者基本一致

lapply(x,fun,...)
sapply(x,fun,...,simplify=T,USE.NAMES=T)

simplify=T返回向量或矩阵(=F返回list),simplify="array"返回数组,USE.NAMES确定返回结果名称(只对x是向量时起作用)

A<-matrix(c(1:9), nrow=3, ncol=3)
B<-matrix(c(4:15), nrow=4, ncol=3)
C<-matrix(rep(seq(8,10),2), nrow=3)
data<-list(A=A, B=B, C=C)   #创建数据集
lapply(A,sum)   #对矩阵A的每个值进行求和(相当于将A转为向量,逐个求和)
lapply(data, "[", ,2)   #提取列表中每一部分第二列的元素
lapply(data, "[", 1,)   #提取列表中每一部分第一行的元素
lapply(data, sum)   #对列表每一部分求和

sapply(data, "[", 2, 1) #提取列表每一部分第二行第一列的数,并以向量形式返回
sapply(data, "[", 2, 1, simplify=F)#提取列表每一部分第二行第一列的数,并以列表形式返回

dat_vec <- c('tian', 'shan', 'zhienng')
sapply(dat_vec, nchar)
sapply(dat_vec, nchar, USE.NAMES = F)   #不返回名称

3.vapply函数

vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE)
X-向量/列表/数组/数据框,FUN.VALUE-设置行索引,USE.NAMES是否返回名称
vapply和sapply函数的区别在于,前者可控制行名

dat_vec<-c('tian', 'shan', 'zhienng')
#计算向量中字符串的长度
vapply(dat_vec,nchar,FUN.VALUE=c('a'= 0),USE.NAMES=F)   #FUN.VALUE值的length要与函数返回值的行数一致(类型也要一致)

4.mapply函数

mapply(FUN,...,MoreArgs=NULL,SIMPLIFY=TRUE,USE.NAMES=TRUE)

#FUN-自定义函数,...FUN的参数,MoreArgs-函数的其他参数列表,SIMPLIFY-自定义返回类型(数组,矩阵或列表),输入-vector不限个数,返回vector或matrix
mapply(rep,1:4,each=2)
mapply(function(x,y) nchar(x)*y,c('wu','xiang','ni'),c(1:3),USE.NAMES=F)

5.tapply函数

tapply(x,INDEX,FUN=NULL,...,simplify=T)

#x-向量,INDEX-种类(每个因子需要与x具有相同的长度),返回向量
#构建数据框-成绩统计
dat_df2<-data.frame(class = sample(1:3,100,replace=T),
gender=sample(c('f','m'),100,replace=T),score=sample(60:95,100,replace=T))
#统计不同班级、不同性别的学生的平均分
tapply(dat_df2$score,INDEX=list(dat_df2$class,dat_df2$gender),mean)

6.rapply函数

rapply可理解为递归版本的lapply,只处理list类型(对list中的每一个元素进行递归遍历,如果list元素中还包括子元素需要继续遍历)

rapply(x,FUN,classes=ANY,deflt=NULL,how=c(unlist,replace,list),...)

#x-list对象,classes-关于类名的字符向量(any表示任何类型),how-字符串匹配的3种结果,
deflt-默认结果(不能用于how='replace')
#how='replace':将x-list元素中的值替换为FUN应用元素后的结果,how=list:将x-list元素中符合classes的类替换为FUN应用元素后的结果,其他替换为deflt的值
 
X <- list(list(a = pi, b = list(c = 1:1)), d = "a test")
rapply(X, function(x) x, how = "replace")   #返回自身
rapply(X, sqrt, classes = "numeric", how = "replace")
rapply(X, nchar, classes = "character", deflt = as.integer(NA), how = "list")
rapply(X, nchar, classes = "character", deflt = as.integer(NA), how = "unlist")
rapply(X, nchar, classes = "character", how = "unlist")
rapply(X, nchar, classes = "character", deflt = 2 ,how = "unlist")
rapply(X, log, classes = "numeric", how = "replace", base = 2)

7.eapply函数

eapply函数可遍历R当前环境空间中的每个变量

eapply(env,FUN,...,all.names=FLASE,USE.NAMES=TRUE)

#env-定义好的R环境空间,all.names-逻辑值,
是否对所有值使用函数,USE.NAMES-控制返回值行名,返回list
 
env<-new.env(hash = FALSE)  #定义一个环境空间
#向这个环境空间中存入3个变量
env$a<-5:15
env$beta<-exp(3:8)
env$logic<-c(TRUE, FALSE, FALSE, TRUE)
#查看env空间中的变量
ls(env)
[1] "a"    "beta"  "logic"
ls.str(env)
a :  int [1:11] 5 6 7 8 9 10 11 12 13 14 ...
beta :  num [1:6] 20.1 54.6 148.4 403.4 1096.6 ...
logic :  logi [1:4] TRUE FALSE FALSE TRUE
#对环境空间内所有对象遍历计算均值
eapply(env, mean)
$logic
[1] 0.5
$beta
[1] 784.0195
$a
[1] 10

8.split函数

split(x,f)-只形成分组,x是向量或者数据框data.frame,f是因子或因子列表,并返回分组列表list

n <- 10; nn <- 100
g <- factor(round(n * runif(n * nn)))
x <- rnorm(n * nn) + sqrt(as.numeric(g))
xg <- split(x, g)   #返回11个list

9.by函数

by函数与tapply函数的运作机制是相同的,但by()的应用对象不仅是向量,也包括矩阵和数据框

aba<-read.csv(“abalone.data”,header=TRUE);
by(aba,aba$Gender,function(m) lm(m[,2]~m[,3]));

————————————————
版权声明:本文为CSDN博主「扯20080808」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38984677/article/details/81676556

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 背景: 鸢尾花数据集最初由Edgar Anderson 测量得到,而后在著名的统计学家和生物学家R.A Fishe...
    土豆学生信阅读 5,125评论 1 18
  • 循环对于代码运行来说是非常消耗时间和资源的,在R中,要尽量少使用for while循环,用apply函数族的话对于...
    willnight阅读 3,444评论 0 2
  • 1 、 apply函数 数据量比较大的时候,R 语言for循环非常的慢,apply函数是最常用的代替for循环的函...
    一刀YiDao阅读 823评论 0 2
  • apply函数族 R函数的诸多有趣特性之一,就是它们可以应用到一系列的数据对象上,包括标量、向量、矩阵、数组、数据...
    11的雾阅读 1,087评论 0 5
  • 刘小泽写于2018.8.27-28我们日常使用R一般不会使用它的编程工作(即写R包的任务),许许多多的的生信函数、...
    刘小泽阅读 27,294评论 1 27