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








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