99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀R語(yǔ)言中的幾類高效函數(shù)
R語(yǔ)言中的幾類高效函數(shù)
2017-02-21
收藏

R語(yǔ)言中的幾類高效函數(shù)

在執(zhí)行R語(yǔ)言任務(wù)時(shí),一個(gè)提高執(zhí)行效率的思路就是盡量避免使用循環(huán)語(yǔ)句,否則你的工作將變的緩慢低效。事實(shí)上,我們是可以有辦法使用一些較高級(jí)的函數(shù)來(lái)盡量避免使用循環(huán)工作的。下面本文將介紹常見(jiàn)的幾種高效函數(shù)。

目錄

1.apply函數(shù)

2.lapply函數(shù)

3.sapply函數(shù)

4.tapply函數(shù)

5.sweep函數(shù)

6.column函數(shù)和row函數(shù)

1)apply函數(shù)

apply函數(shù)主要應(yīng)用在一個(gè)數(shù)組或者矩陣上,通過(guò)給定的函數(shù),并根據(jù)指定的計(jì)算方向(按行或按列),以該方向的數(shù)組為輸入對(duì)象,反回計(jì)算結(jié)果,并將結(jié)果存儲(chǔ)于一個(gè)數(shù)組或向量中。

apply(array, margin, function, ...)

首先定義一個(gè)矩陣data

data <- matrix(rep(seq(4), 4), ncol = 4)

data

[,1] [,2] [,3] [,4]

[1,]    1    1    1    1

[2,]    2    2    2    2

[3,]    3    3    3    3

[4,]    4    4    4    4

#先根據(jù)行求和,其中1為指定按行計(jì)算(1為行,2為列),sum為指定的function

apply(data, 1, sum)

[1]  4  8 12 16

#根據(jù)列求和,其中2為按列計(jì)算

apply(data, 2, sum)

[1] 10 10 10 10

#使用自定義函數(shù),首先定義函數(shù)myfun

myfun <- function(x){

+     sum(x) + 2

+ }

#根據(jù)自定義函數(shù),使用apply函數(shù)計(jì)算

apply(data, 1, myfun)

[1]  6 10 14 18

#自定義函數(shù)還可以寫(xiě)在apply函數(shù)內(nèi)部,不過(guò)需要注意,沒(méi)有大括號(hào)

apply(data, 1, function(x) sum(x) + 2)

[1]  6 10 14 18

#更通用的,可以將函數(shù)寫(xiě)出如下形勢(shì)

apply(data, 1, function(x, y) sum(x) + y, y=2)

[1]  6 10 14 18

2)lapply函數(shù)

lapply用于對(duì)給定的數(shù)據(jù),分別對(duì)其中的元素按指定的函數(shù)計(jì)算,并返回一個(gè)list。對(duì)于數(shù)據(jù)框來(lái)說(shuō),lapply函數(shù)顯得極為友好,在data.frame中,每個(gè)變量可以看做是一個(gè)元素,因此lapply應(yīng)用于data.frame時(shí),可以同時(shí)對(duì)所有變量按指定函數(shù)進(jìn)行計(jì)算。

#首先構(gòu)造一個(gè)數(shù)據(jù)框

data.df<-data.frame(data)

> data.df

X1 X2 X3 X4

1  1  1  1  1

2  2  2  2  2

3  3  3  3  3

4  4  4  4  4

#對(duì)數(shù)據(jù)框所有變量進(jìn)行求和,返回每個(gè)變量的結(jié)果,存儲(chǔ)形式為list。

lapply(data.df, sum)

$X1

[1] 10


$X2

[1] 10


$X3

[1] 10


$X4

[1] 10


#此外,還可以將傳入的函數(shù)改成自定義的函數(shù)。要注意,函數(shù)形式?jīng)]有大括號(hào)。

y1 <- lapply(data.df, function(x, y) sum(x) + y, y = 5)

y1

$X1

[1] 15


$X2

[1] 15


$X3

[1] 15


$X4

[1] 15

#使用lappy代替循環(huán)函數(shù)

unlist(lapply(1:5, function(i) print(i) ))

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

[1] 1 2 3 4 5

#對(duì)比一下for循環(huán)結(jié)果就算結(jié)果,發(fā)現(xiàn)是一致的

for(i in 1:5) print(i)

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

3)sapply函數(shù)

sapply函數(shù)與lapply函數(shù)類似,主要輸入的參數(shù)都是數(shù)據(jù)和函數(shù),但sapply與lapply不同的是sapply返回的是向量,而lapply返回的是一個(gè)list。并且sapply還存在第三個(gè)參數(shù)simplify,當(dāng)silmplify為FALSE時(shí),那么sapply返回的結(jié)果和lapply一致;當(dāng)silmplify為T(mén)RUE時(shí),sapply返回的結(jié)果為一個(gè)向量或者矩陣;此外還可以設(shè)定其它格式。

sapply(list, function, ..., simplify)

y <- sapply(data.df, function(x, y) sum(x) + y, y = 5)

y

X1 X2 X3 X4 

15 15 15 15 

is.vector(y)

[1] TRUE #返回的結(jié)果是一個(gè)向量

#定義simply=F,此時(shí)返回的結(jié)果胃list,效果和apply一樣。

y <- sapply(data.df, function(x, y) sum(x) + y, y = 5,simplify = F)

y

$X1

[1] 15


$X2

[1] 15


$X3

[1] 15


$X4

[1] 15


class(y)

[1] "list"

is.list(y)

[1] TRUE#返回結(jié)果為list

4)tapply函數(shù)

tapply用于對(duì)數(shù)據(jù)進(jìn)行分組計(jì)算,類似于SQL中的group by。tapply需要傳入三個(gè)參數(shù),第一個(gè)是數(shù)據(jù),第二個(gè)是數(shù)據(jù)的分組,第三個(gè)參數(shù)是指定的計(jì)算函數(shù)。

data.df<-data.frame(x=runif(10),group1=rep(1:5,2),group2=rep(1:2,5))

data.df

x        group1 group2

1  0.68180046      1      1

2  0.72726914      2      2

3  0.33735976      3      1

4  0.48212394      4      2

5  0.04234556      5      1

6  0.88701919      1      2

7  0.53946995      2      1

8  0.01295496      3      2

9  0.47062069      4      1

10 0.87079649      5      2

tapply(data.df$x, data.df$group1, mean)

1                2                3              4                 5 

0.4926077 0.7726152 0.6058755 0.6110971 0.3074988

#此處還可以傳入兩個(gè)分組的計(jì)算結(jié)果

tapply(data.df$x, list(data.df$group1,data.df$group2), mean)

1                 2          

1 0.68180046 0.88701919

2 0.53946995 0.72726914

3 0.33735976 0.01295496

4 0.47062069 0.48212394

5 0.04234556 0.87079649

5)sweep函數(shù)

sweep函數(shù)用于對(duì)給定的輸入數(shù)據(jù)做批量的計(jì)算,主要參數(shù)有數(shù)據(jù)、統(tǒng)計(jì)方向、計(jì)算參數(shù)、計(jì)算函數(shù)。其中統(tǒng)計(jì)方向可取1或2,取1表示在行的方向上計(jì)算,2表示在列的方向上計(jì)算。計(jì)算函數(shù)為加減乘除等算是,默認(rèn)為減法'-'。

data<-matrix(runif(20),5)

data.df<-data.frame(data)

data.df

X1               X2                X3         X4         

1 0.09248257 0.4358975 0.1884430 0.1212183

2 0.83091974 0.2388490 0.8377123 0.6140257

3 0.15849016 0.2286257 0.8577217 0.9877683

4 0.86437393 0.2771434 0.5302898 0.1608113

5 0.43098913 0.5906199 0.1117341 0.2846628

#將數(shù)據(jù)按行計(jì)算,每行分別減去各行的最大值

sweep(data.df,1,apply(data.df,1,max),'-')

X1         X2         X3         X4

1 -0.343414887  0.0000000 -0.2474544 -0.3146792

2 -0.006792557 -0.5988633  0.0000000 -0.2236865

3 -0.829278179 -0.7591426 -0.1300467  0.0000000

4  0.000000000 -0.5872305 -0.3340842 -0.7035627

5 -0.159630747  0.0000000 -0.4788858 -0.3059571

6)column函數(shù)和row函數(shù)

還有一些函數(shù)也是基于行和列進(jìn)行統(tǒng)計(jì)計(jì)算的,如對(duì)列進(jìn)行計(jì)算的有colMeans和colSums;對(duì)行計(jì)算的rowMeans和rowSums。

data.df

X1        X2        X3        X4

1 0.09248257 0.4358975 0.1884430 0.1212183

2 0.83091974 0.2388490 0.8377123 0.6140257

3 0.15849016 0.2286257 0.8577217 0.9877683

4 0.86437393 0.2771434 0.5302898 0.1608113

5 0.43098913 0.5906199 0.1117341 0.2846628

#對(duì)列求平均

colMeans(data.df)

X1              X2            X3              X4 

0.4754511 0.3542271 0.5051802 0.4336973

#對(duì)列求和

X1              X2       X3            X4 

2.377256 1.771135 2.525901 2.168486

#對(duì)行求和

rowSums(data.df)

[1] 0.8380414 2.5215068 2.2326058 1.8326183 1.4180059

#對(duì)行求平均

rowMeans(data.df)

[1] 0.2095103 0.6303767 0.5581515 0.4581546 0.3545015


數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }