电竞比分网-中国电竞赛事及体育赛事平台

分享

自學(xué)R語言(十一)-R語言中向量化操作的相關(guān)函數(shù)的學(xué)習(xí)

 迷途中小小書童 2019-04-15

caolong

2019年4月14日

R 我們在日常的數(shù)據(jù)分析過程中,經(jīng)常要進(jìn)行循環(huán)的操作。但是在R語言中,for循環(huán)的效率低下,如果是數(shù)據(jù)量比較大的情況下,可能會花費比較多的時間。因此,我們可以使用向量化操作來代替循環(huán)。向量化可以理解為高效的循環(huán)。

我們主要講解基礎(chǔ)包中的: 1.lapply 2.sapply 3.apply 4.tapply 5.aggregate 6.doBy::summaryBy 7.split #1.基礎(chǔ)包 ##1.1-lapply(對列表,數(shù)據(jù)框進(jìn)行循環(huán)) ###Lapply返回一個列表, 并無視輸入變量的類型

x <- list(a=1:5, b=rnorm(10),c=rnorm(20,1),d=rnorm(100,5))
lapply(x,mean)#結(jié)果為一個列表
## $a
## [1] 3
## 
## $b
## [1] -0.00473966
## 
## $c
## [1] 1.198488
## 
## $d
## [1] 4.94543
knitr::opts_chunk$set(echo = TRUE)

1.2-sapply(簡化lapply函數(shù)返回的結(jié)果)

1.若結(jié)果是一個list,且每個元素長度為1,則會返回一個

向量 ###2.若結(jié)果是一個list,且每個元素長度為大于1,則會返回 一個矩陣 ###3.若其他復(fù)雜的結(jié)果,會返回一個向量

x <- list(a=1:5,b=rnorm(10),c=rnorm(20,1),d=rnorm(100,5))
sapply(x,mean)
##          a          b          c          d 
##  3.0000000 -0.2180703  1.2204910  4.9628198
knitr::opts_chunk$set(echo = TRUE)

1.3-apply此函數(shù)經(jīng)常被用于對矩陣的行或列進(jìn)行指定目的的循環(huán)

1.可以被用于多個數(shù)組的循環(huán)

2.該函數(shù)作用于一行進(jìn)行循環(huán)

x<-matrix(rnorm(24),4,6)
apply(x,1,sum) #對行,此處是簡寫其實本質(zhì)是MARGIN=1
## [1]  1.7468117 -0.4684263 -2.6264194 -2.2550619
apply(x,2,mean) #對列,此處是簡寫其實本質(zhì)是MARGIN=2
## [1]  0.4134592 -0.3323806 -0.2345993 -0.3044445 -0.2624670 -0.1803418
knitr::opts_chunk$set(echo = TRUE)

1.4 tapply(適用于數(shù)據(jù)框的一個連續(xù)變量做分組描述統(tǒng)計)

x<-c(rnorm(10),runif(10),rnorm(10,1))
group <- rep(1:3,each=10)
a <- data.frame(x=x,group=group)
a
##              x group
## 1  -0.14409365     1
## 2  -0.18574981     1
## 3  -0.72858991     1
## 4   0.28562046     1
## 5  -0.98111509     1
## 6   0.40507215     1
## 7   1.73524405     1
## 8   1.30026779     1
## 9  -0.16269420     1
## 10 -0.55332117     1
## 11  0.86508506     2
## 12  0.48553627     2
## 13  0.06496029     2
## 14  0.48918472     2
## 15  0.26840462     2
## 16  0.13526884     2
## 17  0.39505141     2
## 18  0.27805844     2
## 19  0.37989480     2
## 20  0.22612703     2
## 21  1.22601935     3
## 22  1.58276549     3
## 23  1.14964324     3
## 24  3.05631522     3
## 25  1.95935367     3
## 26  0.19120070     3
## 27 -0.15075080     3
## 28  0.46590728     3
## 29  1.35432261     3
## 30  0.48539527     3
tapply(a$x,a$group,mean)
##          1          2          3 
## 0.09706406 0.35875715 1.13201720
knitr::opts_chunk$set(echo = TRUE)

Note:tapply只能針對一個分組變量進(jìn)行分組統(tǒng)計,且只能針對一個連續(xù)變量

執(zhí)行下列就會出錯

#tapply(mtcars[,c('mpg','hp','wt')],mtcars$am,summary)
#Error in tapply(mtcars[, c("mpg", "hp", "wt")], mtcars$am, summary) : 
 # arguments must have same length
knitr::opts_chunk$set(echo = TRUE)

使用之前我們學(xué)過的東西進(jìn)行改進(jìn)的話可以醬紫:

apply(mtcars[,c("am","mpg","hp","wt")],2,function(x) tapply(x,mtcars$am,mean))
##   am      mpg       hp       wt
## 0  0 17.14737 160.2632 3.768895
## 1  1 24.39231 126.8462 2.411000
knitr::opts_chunk$set(echo = TRUE)

但是依然還是有缺陷,就是只能對一個分組變量,不能同時對多個變量進(jìn)行

接下來我們講下怎么彌補(bǔ)這個缺陷: ##方法一:利用aggregate函數(shù)

Myfun <- function(x) c(mean=mean(x),sd=sd(x))
aggregate(mtcars[,c("mpg","hp","wt")],by=list(am=mtcars$am,cyl=mtcars$cyl),Myfun)
##   am cyl   mpg.mean     mpg.sd   hp.mean     hp.sd   wt.mean     wt.sd
## 1  0   4 22.9000000  1.4525839  84.66667  19.65536 2.9350000 0.4075230
## 2  1   4 28.0750000  4.4838599  81.87500  22.65542 2.0422500 0.4093485
## 3  0   6 19.1250000  1.6317169 115.25000   9.17878 3.3887500 0.1162164
## 4  1   6 20.5666667  0.7505553 131.66667  37.52777 2.7550000 0.1281601
## 5  0   8 15.0500000  2.7743959 194.16667  33.35984 4.1040833 0.7683069
## 6  1   8 15.4000000  0.5656854 299.50000  50.20458 3.3700000 0.2828427
knitr::opts_chunk$set(echo = TRUE)

方案2:利用doBy包中的summaryBy函數(shù),首先需要安裝doBy這個數(shù)據(jù)包

library(doBy)
## Warning: package 'doBy' was built under R version 3.5.3
doBy::summaryBy(mpg+hp+wt~am+cyl,data = mtcars,FUN=Myfun)
##   am cyl mpg.mean    mpg.sd   hp.mean    hp.sd  wt.mean     wt.sd
## 1  0   4 22.90000 1.4525839  84.66667 19.65536 2.935000 0.4075230
## 2  0   6 19.12500 1.6317169 115.25000  9.17878 3.388750 0.1162164
## 3  0   8 15.05000 2.7743959 194.16667 33.35984 4.104083 0.7683069
## 4  1   4 28.07500 4.4838599  81.87500 22.65542 2.042250 0.4093485
## 5  1   6 20.56667 0.7505553 131.66667 37.52777 2.755000 0.1281601
## 6  1   8 15.40000 0.5656854 299.50000 50.20458 3.370000 0.2828427
knitr::opts_chunk$set(echo = TRUE)

方案3:利用dplyr包

dplyr::group_by(mtcars,am,cyl) %>% dplyr::summarise(
mpg.mean=mean(mtcars$mpg,na.rm = TRUE),hp.mean=mean(mtcars$hp,na.rm = T))
## # A tibble: 6 x 4
## # Groups:   am [2]
##      am   cyl mpg.mean hp.mean
##   <dbl> <dbl>    <dbl>   <dbl>
## 1     0     4     20.1    147.
## 2     0     6     20.1    147.
## 3     0     8     20.1    147.
## 4     1     4     20.1    147.
## 5     1     6     20.1    147.
## 6     1     8     20.1    147.
knitr::opts_chunk$set(echo = TRUE)

1.5-splitsplit 用于使某向量或?qū)ο蠓譃橹付〝?shù)目的列表,指

定數(shù)目的組由因子列表確定

str(split)
## function (x, f, drop = FALSE, ...)
#function (x, f, drop = FALSE, ...)X是一個向量或數(shù)據(jù)框,F(xiàn)是一個因子或因子列表, Drop表示空因子水平是否舍棄
accepts <- mtcars[,c("am","mpg","wt","hp")]
s<-split(accepts,accepts$am)
sapply(s, function(x) lapply(x[,2:3],function(col) mean(col,na.rm = T)))
##     0        1       
## mpg 17.14737 24.39231
## wt  3.768895 2.411
knitr::opts_chunk$set(echo = TRUE)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多