詳解R語言apply系列函數(shù)的使用
R語言的循環(huán)效率并不高,所以并不推薦循環(huán)以及循環(huán)嵌套。為了實(shí)現(xiàn)循環(huán)功能的情況下,兼顧效率,R語言提供了apply系列函數(shù),用于對(duì)規(guī)則的數(shù)據(jù)進(jìn)行函數(shù)式的迭代處理。
apply
apply函數(shù)作用于兩個(gè)維度以上的數(shù)組或矩陣,其必要的輸入?yún)?shù)有三,分別是待處理數(shù)據(jù)、用于循環(huán)的維度、處理函數(shù),示例如下
data <- matrix(c(1:20), 5, 4) apply(data, 1, mean) # [1] 8.5 9.5 10.5 11.5 12.5
上述代碼的含義是,對(duì)data的第一個(gè)維度,執(zhí)行平均值mean操作,換言之,對(duì)每一行取平均值。data是5行4列的矩陣,每行取平均值,可得到擁有4個(gè)元素的向量。
apply也支持對(duì)多個(gè)坐標(biāo)軸的數(shù)據(jù)進(jìn)行操作,仍以data為例,若想對(duì)所有元素取根號(hào),則可以寫為下面這樣,其結(jié)果于sqrt(data)相同
> apply(data, 1:2, sqrt) [,1] [,2] [,3] [,4] [1,] 1.000000 2.449490 3.316625 4.000000 [2,] 1.414214 2.645751 3.464102 4.123106 [3,] 1.732051 2.828427 3.605551 4.242641 [4,] 2.000000 3.000000 3.741657 4.358899 [5,] 2.236068 3.162278 3.872983 4.472136
lapply, sapply, vapply
apply不能作用于一維數(shù)組,lapply和sapply補(bǔ)充了這一功能
> arr <- apply(data, 1, mean) > apply(arr, 1, sqrt) Error in apply(arr, 1, sqrt) : dim(X)的值必需是正數(shù) > sapply(arr, sqrt) [1] 2.915476 3.082207 3.240370 3.391165 3.535534 > lapply(arr, sqrt) [[1]] [1] 2.915476 [[2]] [1] 3.082207 [[3]] [1] 3.24037 [[4]] [1] 3.391165 [[5]] [1] 3.535534
從上面代碼可知,二者主要區(qū)別是返回值,sapply會(huì)根據(jù)實(shí)際情況調(diào)整返回值,其返回邏輯為
- 1個(gè)列表->向量
- 多個(gè)長(zhǎng)度相同的列表->矩陣,
- 多個(gè)長(zhǎng)度不同的列表->列表
相比之下,vapply可以更加靈活地選擇輸出數(shù)據(jù)類型
> vapply(arr, sqrt, numeric(1)) [1] 2.915476 3.082207 3.240370 3.391165 3.535534
rapply
rapply可以處理嵌套列表,其與lappy的區(qū)別試一下就知道
> x <- list(1,2,c(1:5)) > sapply(x, sqrt) [[1]] [1] 1 [[2]] [1] 1.414214 [[3]] [1] 1.000000 1.414214 1.732051 2.000000 2.236068 > rapply(x, sqrt) [1] 1.000000 1.414214 1.000000 1.414214 1.732051 2.000000 2.236068
換言之,rapply在執(zhí)行的過程中,會(huì)不斷地檢查是否存在列表,如果存在列表,就把這個(gè)列表打開,其可用參數(shù)除了x, fun之外,還可指定處理的類別classes,以及處理方法how,how可選三個(gè)參數(shù)
- "replace" 直接替換list中原來的元素
- "list" 新建一個(gè)列表,元素類型復(fù)合classes則調(diào)用FUN
- "unlist" 相當(dāng)于對(duì)"list"模式下的結(jié)果調(diào)用unlist(recursive=TRUE)
tapply
tapply可對(duì)輸入數(shù)據(jù)進(jìn)行分組操作,下面以鳶尾花數(shù)據(jù)作為示例,來體驗(yàn)一下tapply的用法
> tapply(iris$Sepal.Length, iris$Species, mean) setosa versicolor virginica 5.006 5.936 6.588
iris提供了三種鳶尾花的長(zhǎng)度、寬度等數(shù)據(jù),其中iris$Species為其種類信息。上面代碼的含義是,對(duì)iris的長(zhǎng)度,按照相同的Species取平均值。
mapply
mapply的使用邏輯是,對(duì)兩組相同維度的數(shù)據(jù)進(jìn)行某種函數(shù)操作,類似于執(zhí)行下面的操作
for(i in 1:N){ func(L1[i], L2[i]) }
下面以兩種不同類別的鳶尾花做個(gè)示例
L1<-iris[iris$Species=="setosa",] L2<-iris[iris$Species=="virginica",] max(L1$Sepal.Length, L2$Sepal.Length) # 返回值為7.9,計(jì)算了所有數(shù)據(jù)中的最大值
下面通過mapply,可以發(fā)現(xiàn)對(duì)每種類別的50組數(shù)據(jù)進(jìn)行了以一比對(duì),并選擇出了最大值
> mapply(max, L1$Sepal.Length, L2$Sepal.Length) [1] 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 [16] 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 [31] 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 [46] 6.7 6.3 6.5 6.2 5.9
到此這篇關(guān)于詳解R語言apply系列函數(shù)的使用的文章就介紹到這了,更多相關(guān)R語言 apply系列函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
R語言中corrplot標(biāo)題居中及eps格式輸出
由于論文的需要,很多R語言繪圖需要eps格式矢量圖的方式進(jìn)行輸出,同時(shí)最近也需要繪制相關(guān)性圖,因此決定寫個(gè)博客作為記錄,有需要的朋友可以借鑒參考下2021-11-11R語言科學(xué)計(jì)數(shù)法介紹:digits和scipen設(shè)置方式
這篇文章主要介紹了R語言科學(xué)計(jì)數(shù)法介紹:digits和scipen設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04R語言關(guān)于泊松回歸知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于R語言關(guān)于泊松回歸知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05R語言學(xué)習(xí)之字符串和時(shí)間格式化詳解
這篇文章主要為大家詳細(xì)介紹了R語言中字符串和時(shí)間格式化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03R語言RCode與RStudio使用對(duì)比體驗(yàn)分析總結(jié)
這篇文章主要為大家介紹了R語言RCode與RStudio使用對(duì)比體驗(yàn)分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步2021-11-11詳解R語言中的表達(dá)式、數(shù)學(xué)公式、特殊符號(hào)
這篇文章主要介紹了詳解R語言中的表達(dá)式、數(shù)學(xué)公式、特殊符號(hào),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03R語言 實(shí)現(xiàn)將factor轉(zhuǎn)換成numeric方法
這篇文章主要介紹了R語言 實(shí)現(xiàn)將factor轉(zhuǎn)換成numeric方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03