
r語(yǔ)言常用函數(shù)apply及subset函數(shù)
1、merge函數(shù)對(duì)數(shù)據(jù)框的操作,從兩個(gè)數(shù)據(jù)框中選擇出條件相等的行組合成一個(gè)新的數(shù)據(jù)框
df1=data.frame(name=c("aa","bb","cc"),age=c(20,29,30),sex=c("f","m","f"))
df2=data.frame(name=c("dd","bb","cc"),age=c(40,35,36),sex=c("f","m","f"))
mergedf=merge(df1,df2,by="name")
2、subset函數(shù),從某一個(gè)數(shù)據(jù)框中選擇出符合某條件的數(shù)據(jù)或是相關(guān)的列
(1)單條件查詢
> selectresult=subset(df1,name=="aa")
> selectresult
name age sex
1 aa 20 f
> df1
name age sex
1 aa 20 f
2 bb 29 m
3 cc 30 f
(2)指定顯示列
> selectresult=subset(df1,name=="aa",select=c(age,sex))
> selectresult
age sex
1 20 f
(3)多條件查詢
> selectresult=subset(df1,name=="aa" & sex=="f",select=c(age,sex))
> selectresult
age sex
1 20 f
> df1
name age sex
1 aa 20 f
2 bb 29 m
3 cc 30 f
為什么用apply
因?yàn)槲沂且粋€(gè)程序員,所以在最初學(xué)習(xí)R的時(shí)候,當(dāng)成“又一門編程語(yǔ)言”來(lái)學(xué)習(xí),但是怎么學(xué)都覺得別扭?,F(xiàn)在我的看法傾向于,R不是一種通用型的編程語(yǔ)言,而是一種統(tǒng)計(jì)領(lǐng)域的軟件工具。因此,不能用通用型編程的思維來(lái)設(shè)計(jì)R代碼。在Andrew Lim關(guān)于R和Python的對(duì)比回答中,R是一種面向數(shù)組(array-oriented)的語(yǔ)法,它更像數(shù)學(xué),方便科學(xué)家將數(shù)學(xué)公式轉(zhuǎn)化為R代碼。而Python是一種通用編程語(yǔ)言,更工程化。在使用R時(shí),要盡量用array的方式思考,避免for循環(huán)。不用循環(huán)怎么實(shí)現(xiàn)迭代呢?這就需要用到apply函數(shù)族。它不是一個(gè)函數(shù),而是一族功能類似的函數(shù)。
概述
apply系列函數(shù)的基本作用是對(duì)數(shù)組(array,可以是多維)或者列表(list)按照元素或元素構(gòu)成的子集合進(jìn)行迭代,并將當(dāng)前元素或子集合作為參數(shù)調(diào)用某個(gè)指定函數(shù)。vector是一維的array,dataframe可以看作特殊的list。
這些函數(shù)間的關(guān)系
作用目標(biāo) 在每個(gè)元素上應(yīng)用 在子集合上應(yīng)用
array apply tapply
list lapply(...) by
其中l(wèi)apply(...)包括一族函數(shù)
lapply
|
|-> 簡(jiǎn)化版: sapply
| | -> 可設(shè)置返回值模板: vapply
| |-> 多變量版: mapply
|
|-> 遞歸版: rapply
另外vector比較奇怪,vector是一維的array,但是卻不全是和array使用相同的函數(shù)。在按元素迭代的情況下,使用和list一樣的lapply函數(shù);而在按子集合迭代的情況下,tapply和by都能用,只是返回值形式不同。
功能與語(yǔ)法描述
apply
apply(array, margin, FUN, ...)
在array上,沿margin方向,依次調(diào)用FUN。返回值為vector。margin表示數(shù)組引用的第幾維下標(biāo)(即array[index1, index2, ...]中的第幾個(gè)index),1對(duì)應(yīng)為1表示行,2表示列,c(1,2)表示行列。margin=1時(shí),apply(a, 1, sum)等效于下面的操作
a <- array(c(1:24), dim=c(2,3,4))
result=c()
for (i in c(1:dim(a)[1])) {
result <- c(result, sum(a[i,,]))
}
經(jīng)實(shí)測(cè),只能用在二維及以上的array上,不能用在vector上(如果要應(yīng)用于vector,請(qǐng)使用lapply或sapply)。以matrix為例,如下
> m <- matrix(c(1:10), nrow=2)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> apply(m, 1, sum)
[1] 25 30
> apply(m, 2, sum)
[1] 3 7 11 15 19
tapply
tapply(array, indices, margin, FUN=NULL, ...)
按indices中的值分組,把相同值對(duì)應(yīng)下標(biāo)的array中的元素形成一個(gè)集合,應(yīng)用到FUN。類似于group by indices的操作。如果FUN返回的是一個(gè)值,tapply返回vector;若FUN返回多個(gè)值,tapply返回list。vector或list的長(zhǎng)度和indices中不同值的個(gè)數(shù)相等。
當(dāng)FUN為NULL的時(shí)候,返回一個(gè)長(zhǎng)度和array中元素個(gè)數(shù)相等的vector,指示分組的結(jié)果,vector中相等的元素所對(duì)應(yīng)的下標(biāo)屬于同一組。例如,返回c(1, 2, 1, 3, 2), 表示根據(jù)傳入的indices,第1、3個(gè)元素作為一組,第2、5個(gè)元素作為一組,第4個(gè)元素作為一組。
一維array的例子(即vector)
> v <- c(1:5)
> ind <- c('a','a','a','b','b')
> tapply(v, ind)
[1] 1 1 1 2 2
> tapply(v, ind, sum)
a b
6 9
> tapply(v, ind, fivenum)
$a
[1] 1.0 1.5 2.0 2.5 3.0
$b
[1] 4.0 4.0 4.5 5.0 5.0
二維array的例子(即matrix)
> m <- matrix(c(1:10), nrow=2)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> ind <- matrix(c(rep(1,5), rep(2,5)), nrow=2)
> ind
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 2 2
[2,] 1 1 2 2 2
> tapply(m, ind)
[1] 1 1 1 1 1 2 2 2 2 2
> tapply(m, ind, mean)
1 2
3 8
> tapply(m, ind, fivenum)
$`1`
[1] 1 2 3 4 5
$`2`
[1] 6 7 8 9 10
by
by(dataframe, INDICES, FUN, ..., simplify=TRUE)
by可以當(dāng)成dataframe上的tapply。indices應(yīng)當(dāng)和dataframe每列的長(zhǎng)度相同。返回值是by類型的object。若simplify=FALSE,本質(zhì)上是個(gè)list。
> df <- data.frame(a=c(1:5), b=c(6:10))
> ind <- c(1,1,1,2,2)
> res <- by(df, ind, colMeans)
> res
ind: 1
a b
2 7
------------------------------------------------------------
ind: 2
a b
4.5 9.5
> class(res)
[1] "by"
> names(res)
[1] "1" "2"
lapply
lapply(list, FUN, ...)
在list上逐個(gè)元素調(diào)用FUN??梢杂糜赿ataframe上,因?yàn)閐ataframe是一種特殊形式的list。例
> lst <- list(a=c(1:5), b=c(6:10))
> lapply(lst, mean)
$a
[1] 3
$b
[1] 8
> lapply(lst, fivenum)
$a
[1] 1 2 3 4 5
$b
[1] 6 7 8 9 10
sapply
sapply(list, FUN, ..., simplify, USE.NAME=TRUE)
比lapply多了一個(gè)simplify參數(shù)。如果simplify=FALSE,則等價(jià)于lapply。否則,在上一種情況的基礎(chǔ)上,將lapply輸出的list簡(jiǎn)化為vector或matrix。例
> lst <- list(a=c(1:5), b=c(6:10))
> sapply(lst, mean)
a b
3 8
> sapply(lst, fivenum)
a b
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
vapply
vapply(list, FUN, FUN.VALUE, ..., USE.NAME=TRUE)
vapply類似于sapply,但是提供了第三個(gè)參數(shù)FUN.VALUE用以指明返回值的形式,可以看作返回值的模板。例
> lst <- list(a=c(1:5), b=c(6:10))
> res <- vapply(lst, function(x) c(min(x), max(x)), c(min.=0, max.=0))
> res
a b
min. 1 6
max. 5 10
mapply
mapply(FUN, ..., MoreArgs=NULL, SIMPLIFY=TRUE, USE.NAMES=TRUE)
mapply是多變量版的sapply,參數(shù)(...)部分可以接收多個(gè)數(shù)據(jù),mapply將FUN應(yīng)用于這些數(shù)據(jù)的第一個(gè)元素組成的數(shù)組,然后是第二個(gè)元素組成的數(shù)組,以此類推。要求多個(gè)數(shù)據(jù)的長(zhǎng)度相同,或者是整數(shù)倍關(guān)系。返回值是vector或matrix,取決于FUN返回值是一個(gè)還是多個(gè)。
> mapply(sum, list(a=1,b=2,c=3), list(a=10,b=20,d=30))
a b c
11 22 33
> mapply(function(x,y) x^y, c(1:5), c(1:5))
[1] 1 4 27 256 3125
> mapply(function(x,y) c(x+y, x^y), c(1:5), c(1:5))
[,1] [,2] [,3] [,4] [,5]
[1,] 2 4 6 8 10
[2,] 1 4 27 256 3125
rapply
rapply(list, FUN, classes="ANY", deflt=NULL, how=c("unlist", "replace", "list"), ...)
rapply是遞歸版的lappy。基本原理是對(duì)list作遍歷,如果其中有的元素仍然是list,則繼續(xù)遍歷;對(duì)于每個(gè)非list類型的元素,如果其類型是classes參數(shù)指定的類型之一,則調(diào)用FUN。classes="ANY"表示匹配所有類型。
how參數(shù)用來(lái)指定操作方式,有三種:
"replace" 直接用調(diào)用FUN后的結(jié)果替換原list中原來(lái)的元素
"list" 新建一個(gè)list,元素類型在classes中的,調(diào)用FUN;不在classes中的類型,使用deflt。會(huì)保留原始list的結(jié)構(gòu)。
"unlist" 相當(dāng)于對(duì)"list"模式下的結(jié)果調(diào)用unlist(recursive=TRUE)
> lst <- list(a=list(aa=c(1:5), ab=c(6:10)), b=list(ba=c(1:10)))
> lst
$a
$a$aa
[1] 1 2 3 4 5
$a$ab
[1] 6 7 8 9 10
$b
$b$ba
[1] 1 2 3 4 5 6 7 8 9 10
> rapply(lst, sum, how='list')
$a
$a$aa
[1] 15
$a$ab
[1] 40
$b
$b$ba
[1] 55
> rapply(lst, sum, how='unlist')
a.aa a.ab b.ba
15 40 55
第二個(gè)是關(guān)于classes和deflt參數(shù)使用的例子
> lst2
$a
$a$aa
[1] 1 2 3 4 5
$a$ab
[1] 6 7 8 9 10
$b
$b$ba
[1] "I am a string"
> rapply(lst2, sum, how='unlist')
Error in .Primitive("sum")("I am a string", ...) :
invalid 'type' (character) of argument
> rapply(lst2, sum, classes=c('integer'), deflt=-1, how='unlist')a.aa a.ab b.ba
15 40 -1
> rapply(lst2, nchar, classes=c('character'), deflt=as.integer(NA), how='unlist')
a.aa a.ab b.ba
NA NA 13
eapply
environment上的的apply。從沒用過(guò)environment,暫時(shí)不研究了。
應(yīng)用
tapply實(shí)現(xiàn)crosstable功能
以一個(gè)例子演示。原始數(shù)據(jù)為按年份year、地區(qū)loc和商品類別type進(jìn)行統(tǒng)計(jì)的銷售量。我們要制作兩個(gè)銷售總量的crosstable,一個(gè)以年份為行、地區(qū)為列,一個(gè)以年份為行,類別為列。
> df <- data.frame(year=kronecker(2001:2003, rep(1,4)), loc=c('beijing','beijing','shanghai','shanghai'), type=rep(c('A','B'),6), sale=rep(1:12))
> df
year loc type sale
1 2001 beijing A 1
2 2001 beijing B 2
3 2001 shanghai A 3
4 2001 shanghai B 4
5 2002 beijing A 5
6 2002 beijing B 6
7 2002 shanghai A 7
8 2002 shanghai B 8
9 2003 beijing A 9
10 2003 beijing B 10
11 2003 shanghai A 11
12 2003 shanghai B 12
> tapply(df$sale, df[,c('year','loc')], sum)
loc
year beijing shanghai
2001 3 7
2002 11 15
2003 19 23
> tapply(df$sale, df[,c('year','type')], sum)
type
year A B
2001 4 6
2002 12 14
2003 20 22
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無(wú)監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10