
R語言中apply家族中的系列循環(huán)函數(shù)總結(jié)
R語言中的以apply()函數(shù)為首的apply()家族,提供了強(qiáng)大而方便的循環(huán)功能,這些函數(shù)說起來簡(jiǎn)單,用起來可能就有點(diǎn)蒙圈兒了。這些函數(shù)確實(shí)簡(jiǎn)單,但是可能很多人搞不清這些函數(shù)究竟有什么用處與區(qū)別呢?R中不是已經(jīng)有for循環(huán)了嗎?其實(shí)作為一種與Matlab一樣的向量化語言,用for循環(huán)會(huì)把本來速度就慢的R語言的速度拖的更慢,這就要用到apply()家族函數(shù)了,下面就對(duì)apply()家族中的函數(shù)分別做詳細(xì)的介紹,以便于區(qū)別他們。
1、apply函數(shù)
apply()是用的最多,也是最好理解的函數(shù)了。比如
> x<-cbind(3,c(1:5,4:1))
x是一個(gè)9行2列的矩陣
> x
[,1] [,2]
[1,] 3 1
[2,] 3 2
[3,] 3 3
[4,] 3 4
[5,] 3 5
[6,] 3 4
[7,] 3 3
[8,] 3 2
[9,] 3 1
> apply(x,1,mean)
[1] 2.0 2.5 3.0 3.5 4.0 3.5 3.0 2.5 2.0
> apply(x,2,mean)
[1] 3.000000 2.777778
這里第一個(gè)參數(shù)表示應(yīng)用的數(shù)據(jù)為x,第三個(gè)參數(shù)為應(yīng)用的函數(shù)名(這里是平均值函數(shù)),第二個(gè)參數(shù)取1表示對(duì)9行數(shù)據(jù)求每行均值,取2表示對(duì)2列每列求均值。其實(shí)對(duì)于一個(gè)三維數(shù)組,第二個(gè)參數(shù)取3表示對(duì)第三維分別應(yīng)用指定的函數(shù)。比如
> x<-array(c(1:24),dim = c(2,3,4))
> x
, , 1
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
, , 2
[,1] [,2] [,3]
[1,] 7 9 11
[2,] 8 10 12
, , 3
[,1] [,2] [,3]
[1,] 13 15 17
[2,] 14 16 18
, , 4
[,1] [,2] [,3]
[1,] 19 21 23
[2,] 20 22 24
> apply(x,3,mean)
[1] 3.5 9.5 15.5 21.5
這里,由于x的第三維有4個(gè)組,因此循環(huán)進(jìn)行了4次,得出了4個(gè)值。當(dāng)然了,這里的指定函數(shù)也可以是自定義函數(shù)。
2、lapply函數(shù)
apply()函數(shù)主要是對(duì)向量進(jìn)行循環(huán),而lapply()函數(shù)則在對(duì)列表元素進(jìn)行循環(huán)時(shí)特別有用。
例一
> apply(x,3,mean)
[1] 3.5 9.5 15.5 21.5
> x<-list(a1 = c(1:8),a2 = c(TRUE,FALSE,FALSE,TRUE,TRUE))
> x
$a1
[1] 1 2 3 4 5 6 7 8
$a2
[1] TRUE FALSE FALSE TRUE TRUE
> lapply(x,mean)
$a1
[1] 4.5
$a2
[1] 0.6
這里用lapply()函數(shù)指定用mean對(duì)列表的2個(gè)元素進(jìn)行遍歷求均值,這里列表的第二個(gè)元素為布爾型,顯然將其0~1對(duì)待,求出了均值。
例二
> lapply(x,quantile)
$a1
0% 25% 50% 75% 100%
1.00 2.75 4.50 6.25 8.00
$a2
0% 25% 50% 75% 100%
0 0 1 1 1
這里用lapply()函數(shù)指定quantile給出了x的分位數(shù)。
3、sapply函數(shù)
看下面例子
> sapply(x,quantile)
a1 a2
0% 1.00 0
25% 2.75 0
50% 4.50 1
75% 6.25 1
100% 8.00 1
顯然,我們發(fā)現(xiàn)這里用sapply()函數(shù)也指定quantile求出了x的分位數(shù),與lapply()函數(shù)不同的是:sapply()函數(shù)默認(rèn)返回的是一個(gè)矩陣,而lapply()函數(shù)返回的時(shí)一個(gè)列表。其實(shí),在sapply()函數(shù)中如果返回的長(zhǎng)度不一樣不能生成矩陣時(shí),才會(huì)生成一個(gè)列表。
> x1
$a1
[1] 1 2 3 4 5 6 7 8
$a2
[1] TRUE FALSE FALSE TRUE TRUE
這里自定義函數(shù)f()返回參數(shù)本身,x中兩列不一樣長(zhǎng),返回類型就為列表。
4、tapply函數(shù)
前面介紹的apply()、lapply()、sapply()函數(shù)提供的分組循環(huán)方式都很簡(jiǎn)單,tapply()函數(shù)提供了更強(qiáng)大、更靈活的循環(huán)方式,可能也更難以理解。
例一
> a<-as.factor(c(1,1,2,3,3))
> a
[1] 1 1 2 3 3
Levels: 1 2 3
> tapply(a,a,length)
1 2 3
2 1 2
這里tapply()函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)指定因子類型a為被循環(huán)對(duì)象,第二個(gè)參數(shù)指定a為指針參數(shù),第三個(gè)參數(shù)指定應(yīng)用的函數(shù)為求長(zhǎng)度函數(shù)length,這里由于a的因子水平為3,故tapply()函數(shù)循環(huán)了三次,分別求出三個(gè)水平的出現(xiàn)次數(shù)。
例二
這里以warpbreaks數(shù)據(jù)集為例
> head(warpbreaks)
breaks wool tension
1 26 A L
2 30 A L
3 54 A L
4 25 A L
5 70 A L
6 52 A L
> summary(warpbreaks[,c(2:3)])
wool tension
A:27 L:18
B:27 M:18
H:18
warpbreaks的wool變量有兩個(gè)分類,tension有三個(gè)分類。
> tapply(warpbreaks$breaks,warpbreaks[-1],sum)
tension
wool L M H
A 401 216 221
B 254 259 169
這里以warpbreaks的breaks變量作為應(yīng)用對(duì)象,除去第一列(warpbreaks[-1])作為指針參數(shù),第三個(gè)參數(shù)是應(yīng)用求和函數(shù)。這里函數(shù)作用相當(dāng)于一個(gè)分類匯總的功能wool有兩個(gè)變量,tension有三個(gè)變量,一共有2x3 = 6種組合。比如wool = A,tension = L時(shí)求和所有breaks就是401。我們可以檢驗(yàn)一下如下:
> sum(warpbreaks[which((warpbreaks$wool=='A')&warpbreaks$tension == 'L'),1])
[1] 401
顯然,wool = A,tension = L時(shí)求和所有breaks就是401。
5、mapply函數(shù)
mapply()函數(shù)與tapply()函數(shù)還是比較相似的,不過與其它apply家族的函數(shù)相比,mapply()函數(shù)的另一個(gè)特點(diǎn)是它的參數(shù)順序與其它函數(shù)恰好相反。
例一
> mapply(rep,1:4,4:1)
[[1]]
[1] 1 1 1 1
[[2]]
[1] 2 2 2
[[3]]
[1] 3 3
[[4]]
[1] 4
這里mapply()函數(shù)有三個(gè)參數(shù),第一個(gè)指定應(yīng)用的 函數(shù)為rep,就是重復(fù)函數(shù);第二個(gè)參數(shù)指定被應(yīng)用的對(duì)象為序列4:1,第三個(gè)參數(shù)指定重復(fù)的次數(shù)分別為1:4,即4要重復(fù)一次,3要重復(fù)兩次等。數(shù)據(jù)分析師培訓(xùn)
例二
mapply(function(x,y) seq_len(x)+y,c(1,2,3),c(10,20,30))
[[1]]
[1] 11
[[2]]
[1] 21 22
[[3]]
[1] 31 32 33
這里自定義了一個(gè)函數(shù)seq_len(x)+y,其中seq_len(x)函數(shù)作用是生成一個(gè)1:X的序列,比如:
> seq_len(3)
[1] 1 2 3
那么對(duì)c(1,2,3)就會(huì)依次生成1,1:2,1:3的序列,再分別加上10,20,30,就會(huì)得到那樣的結(jié)果了。
可以看出,mapply()函數(shù)主要是對(duì)中間對(duì)象元素與第三個(gè)對(duì)象元素一一對(duì)應(yīng),分別應(yīng)用前面的指定函數(shù)。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03