apply函數(shù)族+split+by

引用自R語言向量化運(yùn)算之a(chǎn)pply函數(shù)族+split+byhttps://blog.csdn.net/qq_38984677/article/details/81676556

apply函數(shù)族包括

apply(),lapply(),sapply(),vapply(),mapply(),rapply(),tapply(),在實(shí)際應(yīng)用中需要依據(jù)不同數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)處理目的采用不同的函數(shù)。

1.apply函數(shù)

apply(x, margin, 指定的函數(shù), ...)
可以將任意一個(gè)函數(shù)應(yīng)用到數(shù)組或矩陣(所有數(shù)據(jù)必須同一類型)的任何維度上,...包含了任何能傳遞到fun的參數(shù),margin=1表示行,margin=2表示列,margin=c(1,2)表示同時(shí)以行和列為單位進(jìn)行計(jì)算,返回向量或矩陣
apply(tian,2,mean,trim=0.2) #計(jì)算每列的截尾均值

2.lapply和sapply函數(shù)

兩個(gè)函數(shù)都可用于處理list\vector\array\matrix\data.frame類型數(shù)據(jù)蛋叼,但lapply()返回list數(shù)據(jù)類型威根,其他方面兩者基本一致

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

simplify=T返回向量或矩陣(=F返回list),simplify="array"返回?cái)?shù)組,USE.NAMES確定返回結(jié)果名稱(只對(duì)x是向量時(shí)起作用)

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)   #創(chuàng)建數(shù)據(jù)集
lapply(A,sum)   #對(duì)矩陣A的每個(gè)值進(jìn)行求和(相當(dāng)于將A轉(zhuǎn)為向量,逐個(gè)求和)
lapply(data, "[", ,2)   #提取列表中每一部分第二列的元素
lapply(data, "[", 1,)   #提取列表中每一部分第一行的元素
lapply(data, sum)   #對(duì)列表每一部分求和

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

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

3.vapply函數(shù)

vapply(X,FUN,FUN.VALUE,...,USE.NAMES=TRUE)
X-向量/列表/數(shù)組/數(shù)據(jù)框,FUN.VALUE-設(shè)置行索引,USE.NAMES是否返回名稱
vapply和sapply函數(shù)的區(qū)別在于,前者可控制行名

dat_vec<-c('tian', 'shan', 'zhienng')
#計(jì)算向量中字符串的長度
vapply(dat_vec,nchar,FUN.VALUE=c('a'= 0),USE.NAMES=F)   #FUN.VALUE值的length要與函數(shù)返回值的行數(shù)一致(類型也要一致)

4.mapply函數(shù)

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

#FUN-自定義函數(shù),...FUN的參數(shù),MoreArgs-函數(shù)的其他參數(shù)列表,SIMPLIFY-自定義返回類型(數(shù)組,矩陣或列表),輸入-vector不限個(gè)數(shù),返回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函數(shù)

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

#x-向量,INDEX-種類(每個(gè)因子需要與x具有相同的長度),返回向量
#構(gòu)建數(shù)據(jù)框-成績統(tǒng)計(jì)
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))
#統(tǒng)計(jì)不同班級(jí)眷细、不同性別的學(xué)生的平均分
tapply(dat_df2$score,INDEX=list(dat_df2$class,dat_df2$gender),mean)

6.rapply函數(shù)

rapply可理解為遞歸版本的lapply隶糕,只處理list類型(對(duì)list中的每一個(gè)元素進(jìn)行遞歸遍歷,如果list元素中還包括子元素需要繼續(xù)遍歷)

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

#x-list對(duì)象,classes-關(guān)于類名的字符向量(any表示任何類型),how-字符串匹配的3種結(jié)果,
deflt-默認(rèn)結(jié)果(不能用于how='replace')
#how='replace':將x-list元素中的值替換為FUN應(yīng)用元素后的結(jié)果,how=list:將x-list元素中符合classes的類替換為FUN應(yīng)用元素后的結(jié)果,其他替換為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函數(shù)

eapply函數(shù)可遍歷R當(dāng)前環(huán)境空間中的每個(gè)變量

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

#env-定義好的R環(huán)境空間,all.names-邏輯值,
是否對(duì)所有值使用函數(shù),USE.NAMES-控制返回值行名,返回list
 
env<-new.env(hash = FALSE)  #定義一個(gè)環(huán)境空間
#向這個(gè)環(huán)境空間中存入3個(gè)變量
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
#對(duì)環(huán)境空間內(nèi)所有對(duì)象遍歷計(jì)算均值
eapply(env, mean)
$logic
[1] 0.5
$beta
[1] 784.0195
$a
[1] 10

8.split函數(shù)

split(x,f)-只形成分組,x是向量或者數(shù)據(jù)框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個(gè)list

9.by函數(shù)

by函數(shù)與tapply函數(shù)的運(yùn)作機(jī)制是相同的吨瞎,但by()的應(yīng)用對(duì)象不僅是向量痹兜,也包括矩陣和數(shù)據(jù)框

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

————————————————
版權(quán)聲明:本文為CSDN博主「扯20080808」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議颤诀,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明字旭。
原文鏈接:https://blog.csdn.net/qq_38984677/article/details/81676556

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市崖叫,隨后出現(xiàn)的幾起案子遗淳,更是在濱河造成了極大的恐慌,老刑警劉巖心傀,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屈暗,死亡現(xiàn)場離奇詭異,居然都是意外死亡脂男,警方通過查閱死者的電腦和手機(jī)养叛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宰翅,“玉大人一铅,你說我怎么就攤上這事《橛停” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵肮之,是天一觀的道長掉缺。 經(jīng)常有香客問我,道長戈擒,這世上最難降的妖魔是什么眶明? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮筐高,結(jié)果婚禮上搜囱,老公的妹妹穿的比我還像新娘。我一直安慰自己柑土,他們只是感情好蜀肘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著稽屏,像睡著了一般扮宠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狐榔,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天坛增,我揣著相機(jī)與錄音获雕,去河邊找鬼。 笑死收捣,一個(gè)胖子當(dāng)著我的面吹牛届案,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罢艾,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼楣颠,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了昆婿?” 一聲冷哼從身側(cè)響起球碉,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仓蛆,沒想到半個(gè)月后睁冬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡看疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年豆拨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能庆。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡施禾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搁胆,到底是詐尸還是另有隱情弥搞,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布渠旁,位于F島的核電站攀例,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏顾腊。R本人自食惡果不足惜粤铭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杂靶。 院中可真熱鬧梆惯,春花似錦、人聲如沸吗垮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烁登。三九已至职烧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚀之。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蝗敢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人足删。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓寿谴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親失受。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讶泰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容