第13天 apply族函數的應用
1. 函數apply()
對數據對象的一個維度,都作用上某函數,生成列表、多維數組或向量?;靖袷綖椋?/span>
apply(x, MARGIN=..., fun, ...)
其中,x為數據對象(矩陣、多維數組、數據框);MARGIN=1表示按行,2表示按列;fun表示要作用的函數。
通常來說,apply函數經常用來計算矩陣中行或列的均值、和值的函數。
> x<-matrix(1:6,ncol=2)
> x
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> apply(x,1,mean) #按行求均值
[1] 2.5 3.5 4.5
> apply(x,2,mean) #按列求均值
[1] 2 5
2. 函數lapply()
對數據對象的每一個元素,都作用上某函數,生成一個與元素個數相同的值列表?;靖袷綖椋?/span>
lapply(x, fun, ...)
其中,x為數據對象(列表、數據框、向量)。
lapply對每列進行操作,非常適合數據框;在R中數據框是一種特殊的列表,所以數據框的列也將作為函數的處理對象。
> x<-list(a=1:5,b=exp(0:3))
> x
$a
[1] 1 2 3 4 5
$b
[1] 1.000000 2.718282 7.389056 20.085537
> lapply(x,mean)
$a
[1] 3
$b
[1] 7.798219
3. 函數sapply()
基本格式為:
lapply(x, fun, ..., simplify=TRUE, USE.NAMES=...)
比函數lapply()多了一個參數simplify,若simplify=FALSE,則同lapply();若為TRUE,則將輸出的list簡化為向量或矩陣;若USE.NAMES為TRUE,且x為字符型,則用x作為結果的名稱。
simplify=F:返回值的類型是list,此時與lapply完全相同
simplify=T(默認值):返回值的類型由計算結果定,如果函數返回值長度為1,則sapply將list簡化為vector;
> sapply(x, mean, simplify = TRUE) #x同上例
a b
3.000000 7.798219
> list<-list(c("a","b","c"),c("A","B","C"))
> list
[[1]]
[1] "a" "b" "c"
[[2]]
[1] "A" "B" "C"
#將列表list中的元素與數字1~3連接
> sapply(list, paste, 1:3, simplify = TRUE)
[,1] [,2]
[1,] "a 1" "A 1"
[2,] "b 2" "B 2"
[3,] "c 3" "C 3"
> sapply(list, paste, 1:3, simplify = FALSE)
[[1]]
[1] "a 1" "b 2" "c 3"
[[2]]
[1] "A 1" "B 2" "C 3"
4. 函數tapply()
對不規則陣列,對照一組確定因子作用某函數?;靖袷綖椋?/span>
tapply(x, INDEX, fun, ..., simplify=TRUE)
其中,x通常為向量;INDEX為與x長度相同的因子列表(若不是因子,R會強制轉化為因子);simplify=TRUE(默認)且fun計算結果為標量值,則返回值為數組,若為FALSE,則返回值為list對象。
x是需要處理的向量,INDEX是因子(因子列表),FUN是需要執行的函數,simplify指是否簡化輸入結果(考慮sapply對于lapply的簡化)
x可以是數據庫的一個變量,也可以是單獨的向量。
> height<-c(174,165,180,171,160)
> sex<-c("F","F","M","M","F")
> tapply(height,sex,mean) #計算不同sex對應的height的均值
F M
166.3333 175.5000
5. 函數mapply()
是函數sapply()的多變量版本,將對多個變量的每個參數作用某函數。基本格式為:
mapply(fun, MoreArgs=NULL, SIMPLIFY=TRUE, USE.NAMES=TRUE)
其中,MoreArgs為fun函數的其它參數列表;SIMPLIFY為邏輯值或字符串,取值為TRUR時,將結果轉化為一個向量、矩陣或高維陣列(但不是所有結果都可轉化)。
#重復生成列表list(x=1:2), 重復次數times=1:3,結果為列表
> mapply(rep, times=1:3, MoreArgs = list(x=1:2))
[[1]]
[1] 1 2
[[2]]
[1] 1 2 1 2
[[3]]
[1] 1 2 1 2 1 2
#重復生成列表list(x=1:2), 重復次數times=c(2,2),結果為矩陣
> mapply(rep, times=c(2,2), MoreArgs = list(x=1:2))
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2
6. 醫學數據分析中apply族的應用
對于醫學數據而言,實際上很多情況我們不太會把所有的行,或者所有的列求一個均數或者求一個中位數,但是其它函數就會用的比較多。比如,我們要看看各個變量的缺失值數據,比如把很多數值變量因子化。
我們先導入數據庫elder1和elder2
t1<-read_csv("elder1.csv")
t2<-read_csv("elder2.csv")
查看變量的類型
sapply(t1,class)
是不是都是數字變量呢
sapply(t1,is.numeric)
把部分變量轉為因子
vars<-c(“sex”,”marriage”,”education”,”huji”,”income”,”smoking”)
t2[vars] <- lapply(t2[vars], factor)
分組計算均數
tapply(t2$health,t2$sex,mean, na.rm = TRUE)
分組計數
tapply(t2$marriage,t2$sex,table)
看看到底各變量有多少缺失值
naf<-function(x){
nas<-sum(is.na(x))
return(nas)
}
apply(t1,2, naf)
這段程序就是自編與apply族函數的聯合。光apply族函數無法直接計算每一個變量的缺失值個數,但是我們用自編函數把is.na ()和sum()進行整合,形成新的函數naf,那么我們就可以進行批量操作了。
Apply族函數無論是在變量轉換、數據統計描述甚至是統計分析,都具有一定的價值。它的批量作業法使它變成R語言非常重要系列函數。
DAY13的內容就介紹到這里!
最后,一個月就能學會R語言,你敢挑戰一下嗎?
想挑戰的話,請加入R語言的交流群吧?(由于群規模限制,請先加入鄭老師微信號:掃描以下二維碼,并注明R語言)