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

熱線電話:13121318867

登錄
首頁精彩閱讀R語言中的幾類高效函數
R語言中的幾類高效函數
2017-02-21
收藏

R語言中的幾類高效函數

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

目錄

1.apply函數

2.lapply函數

3.sapply函數

4.tapply函數

5.sweep函數

6.column函數和row函數

1)apply函數

apply函數主要應用在一個數組或者矩陣上,通過給定的函數,并根據指定的計算方向(按行或按列),以該方向的數組為輸入對象,反回計算結果,并將結果存儲于一個數組或向量中。

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

首先定義一個矩陣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

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

apply(data, 1, sum)

[1]  4  8 12 16

#根據列求和,其中2為按列計算

apply(data, 2, sum)

[1] 10 10 10 10

#使用自定義函數,首先定義函數myfun

myfun <- function(x){

+     sum(x) + 2

+ }

#根據自定義函數,使用apply函數計算

apply(data, 1, myfun)

[1]  6 10 14 18

#自定義函數還可以寫在apply函數內部,不過需要注意,沒有大括號

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

[1]  6 10 14 18

#更通用的,可以將函數寫出如下形勢

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

[1]  6 10 14 18

2)lapply函數

lapply用于對給定的數據,分別對其中的元素按指定的函數計算,并返回一個list。對于數據框來說,lapply函數顯得極為友好,在data.frame中,每個變量可以看做是一個元素,因此lapply應用于data.frame時,可以同時對所有變量按指定函數進行計算。

#首先構造一個數據框

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

#對數據框所有變量進行求和,返回每個變量的結果,存儲形式為list。

lapply(data.df, sum)

$X1

[1] 10


$X2

[1] 10


$X3

[1] 10


$X4

[1] 10


#此外,還可以將傳入的函數改成自定義的函數。要注意,函數形式沒有大括號。

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)函數

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

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

[1] 1 2 3 4 5

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

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

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

3)sapply函數

sapply函數與lapply函數類似,主要輸入的參數都是數據和函數,但sapply與lapply不同的是sapply返回的是向量,而lapply返回的是一個list。并且sapply還存在第三個參數simplify,當silmplify為FALSE時,那么sapply返回的結果和lapply一致;當silmplify為TRUE時,sapply返回的結果為一個向量或者矩陣;此外還可以設定其它格式。

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 #返回的結果是一個向量

#定義simply=F,此時返回的結果胃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#返回結果為list

4)tapply函數

tapply用于對數據進行分組計算,類似于SQL中的group by。tapply需要傳入三個參數,第一個是數據,第二個是數據的分組,第三個參數是指定的計算函數。

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

#此處還可以傳入兩個分組的計算結果

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函數

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

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

#將數據按行計算,每行分別減去各行的最大值

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函數和row函數

還有一些函數也是基于行和列進行統(tǒng)計計算的,如對列進行計算的有colMeans和colSums;對行計算的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

#對列求平均

colMeans(data.df)

X1              X2            X3              X4 

0.4754511 0.3542271 0.5051802 0.4336973

#對列求和

X1              X2       X3            X4 

2.377256 1.771135 2.525901 2.168486

#對行求和

rowSums(data.df)

[1] 0.8380414 2.5215068 2.2326058 1.8326183 1.4180059

#對行求平均

rowMeans(data.df)

[1] 0.2095103 0.6303767 0.5581515 0.4581546 0.3545015


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

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(), // 加隨機數防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數1:配置參數 // 參數2:回調,回調的第一個參數驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".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 = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+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); }