R語言中的循環(huán)函數(shù)(Grouping Function) R語言中有幾個(gè)常用的函數(shù),可以按組對(duì)數(shù)據(jù)進(jìn)行處理,apply, lapply, sapply, tapply, mapply,等。這幾個(gè)函數(shù)功能有些類似,下面介紹下這幾個(gè)函數(shù)的用法。
Apply
這是對(duì)一個(gè)Matrix或者Array進(jìn)行某個(gè)維度的運(yùn)算。其格式是:
Apply(數(shù)據(jù),維度Index,運(yùn)算函數(shù),函數(shù)的參數(shù))
對(duì)于Matrix來說,其維度值為2,第二個(gè)參數(shù)維度Index中,1表示按行運(yùn)算,2表示按列運(yùn)算。下面舉一個(gè)例子:
m<-matrix(1:6,2,3)
構(gòu)建一個(gè)簡單的2行3列的矩陣,內(nèi)容為:
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
如果我們要計(jì)算每一行的sum值,那么我們可以寫為:apply(m,1,sum)[1] 9 12如果要計(jì)算每一列的mean值,那么改為:apply(m,2,mean)[1] 1.5 3.5 5.5假如某個(gè)值為NA,那么要忽略NA值,進(jìn)行每一行的SUM怎么辦呢?m[2,2]<-NA [,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 NA 6
apply(m,1,sum)
[1] 9 NA 本身sum函數(shù)有一個(gè)參數(shù)na.rm,我們可以將這個(gè)參數(shù)帶人到apply函數(shù)中,作為第4個(gè)參數(shù):apply(m,1,sum,na.rm=TRUE)
[1] 9 8 需要注意的是如果是Data Frame,那么系統(tǒng)會(huì)將其轉(zhuǎn)為Matrix,如果所有Column不是數(shù)字類型或者類型不一致,導(dǎo)致轉(zhuǎn)換失敗,那么apply是運(yùn)算不出任何一列的結(jié)果的。Lapply
前面說到apply是對(duì)于matrix和array的,針對(duì)list,我們可以使用lapply函數(shù)。該函數(shù)接收list,返回的結(jié)果也是一個(gè)list。其調(diào)用如下:Apply(數(shù)據(jù),運(yùn)算函數(shù),函數(shù)的參數(shù))對(duì)于Data Frame來說,如果不同的列有不同的數(shù)據(jù)類型,不能轉(zhuǎn)換成Matrix,但是卻可以轉(zhuǎn)換成List,然后使用lapply函數(shù)。我們建立一個(gè)學(xué)生名字,年齡和成績的Data Frame,然后統(tǒng)計(jì)平均年齡和平均成績,由于name列不是數(shù)值類型,所以無法算平均值,所以我們可以對(duì)非數(shù)值的數(shù)據(jù)只取count數(shù)量。這里就需要用到自定義函數(shù)。函數(shù)可以是匿名函數(shù),也可以是之前定義好的函數(shù),由于這里邏輯簡單,我們可以用匿名函數(shù)解決。s<-data.frame(name=c("Devin","Edward","Lulu"),age=c(30,33,29),score=c(95,99,90))
name age score
1 Devin 30 95
2 Edward 33 99
3 Lulu 29 90
lapply(s,function(x){if(is.numeric(x)){mean(x)}else{length(x)}})
$name
[1] 3
$age
[1] 30.66667
$score
[1] 94.66667我們可以看到返回了一個(gè)List的結(jié)果,里面包含3個(gè)項(xiàng),每個(gè)項(xiàng)是函數(shù)執(zhí)行的結(jié)果。lapply返回的結(jié)果和傳入的List的結(jié)構(gòu)相同,傳入多少個(gè)Item,返回的也是多少個(gè)Item。Sapply
Sapply函數(shù)和Lapply函數(shù)很類似,也是對(duì)List進(jìn)行處理,只是在返回結(jié)果上,Sapply會(huì)根據(jù)結(jié)果的數(shù)據(jù)類型和結(jié)構(gòu),重新構(gòu)建一個(gè)合理的數(shù)據(jù)類型返回。調(diào)用格式如下:Apply(數(shù)據(jù),運(yùn)算函數(shù),函數(shù)的參數(shù),simplify = TRUE, USE.NAMES = TRUE)對(duì)于其中的simplify參數(shù),就是指明是否對(duì)返回的結(jié)果集重新組織,如果為FALSE,那么就相當(dāng)于lapply了。{if(is.numeric(x)){mean(x)}else{length(x)}})
name age score
3.00000 30.66667 94.66667








暫無數(shù)據(jù)