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

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀R語言中apply家族中的系列循環(huán)函數(shù)總結(jié)
R語言中apply家族中的系列循環(huán)函數(shù)總結(jié)
2017-04-08
收藏

R語言中apply家族中的系列循環(huán)函數(shù)總結(jié)

R語言中的以apply()函數(shù)為首的apply()家族,提供了強(qiáng)大而方便的循環(huán)功能,這些函數(shù)說起來簡(jiǎn)單,用起來可能就有點(diǎn)蒙圈兒了。這些函數(shù)確實(shí)簡(jiǎn)單,但是可能很多人搞不清這些函數(shù)究竟有什么用處與區(qū)別呢?R中不是已經(jīng)有for循環(huán)了嗎?其實(shí)作為一種與Matlab一樣的向量化語言,用for循環(huán)會(huì)把本來速度就慢的R語言的速度拖的更慢,這就要用到apply()家族函數(shù)了,下面就對(duì)apply()家族中的函數(shù)分別做詳細(xì)的介紹,以便于區(qū)別他們。

1、apply函數(shù)

apply()是用的最多,也是最好理解的函數(shù)了。比如

> x<-cbind(3,c(1:5,4:1))

x是一個(gè)9行2列的矩陣


> x

[,1] [,2]

[1,]    3    1

[2,]    3    2

[3,]    3    3

[4,]    3    4

[5,]    3    5

[6,]    3    4

[7,]    3    3

[8,]    3    2

[9,]    3    1

> apply(x,1,mean)

[1] 2.0 2.5 3.0 3.5 4.0 3.5 3.0 2.5 2.0

> apply(x,2,mean)

[1] 3.000000 2.777778

這里第一個(gè)參數(shù)表示應(yīng)用的數(shù)據(jù)為x,第三個(gè)參數(shù)為應(yīng)用的函數(shù)名(這里是平均值函數(shù)),第二個(gè)參數(shù)取1表示對(duì)9行數(shù)據(jù)求每行均值,取2表示對(duì)2列每列求均值。其實(shí)對(duì)于一個(gè)三維數(shù)組,第二個(gè)參數(shù)取3表示對(duì)第三維分別應(yīng)用指定的函數(shù)。比如


> x<-array(c(1:24),dim = c(2,3,4))

> x

, , 1


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

[1,]    1    3    5

[2,]    2    4    6


, , 2


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

[1,]    7    9   11

[2,]    8   10   12


, , 3


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

[1,]   13   15   17

[2,]   14   16   18


, , 4


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

[1,]   19   21   23

[2,]   20   22   24

> apply(x,3,mean)

[1]  3.5  9.5 15.5 21.5

這里,由于x的第三維有4個(gè)組,因此循環(huán)進(jìn)行了4次,得出了4個(gè)值。當(dāng)然了,這里的指定函數(shù)也可以是自定義函數(shù)。


2、lapply函數(shù)

apply()函數(shù)主要是對(duì)向量進(jìn)行循環(huán),而lapply()函數(shù)則在對(duì)列表元素進(jìn)行循環(huán)時(shí)特別有用。

例一

> apply(x,3,mean)

[1]  3.5  9.5 15.5 21.5

> x<-list(a1 = c(1:8),a2 = c(TRUE,FALSE,FALSE,TRUE,TRUE))

> x

$a1

[1] 1 2 3 4 5 6 7 8


$a2

[1]  TRUE FALSE FALSE  TRUE  TRUE

> lapply(x,mean)

$a1

[1] 4.5


$a2

[1] 0.6

這里用lapply()函數(shù)指定用mean對(duì)列表的2個(gè)元素進(jìn)行遍歷求均值,這里列表的第二個(gè)元素為布爾型,顯然將其0~1對(duì)待,求出了均值。

例二

> lapply(x,quantile)

$a1

0%  25%  50%  75% 100% 

1.00 2.75 4.50 6.25 8.00 


$a2

0%  25%  50%  75% 100% 

0    0    1    1    1 

這里用lapply()函數(shù)指定quantile給出了x的分位數(shù)。


3、sapply函數(shù)

看下面例子

> sapply(x,quantile)

a1 a2

0%   1.00  0

25%  2.75  0

50%  4.50  1

75%  6.25  1

100% 8.00  1

顯然,我們發(fā)現(xiàn)這里用sapply()函數(shù)也指定quantile求出了x的分位數(shù),與lapply()函數(shù)不同的是:sapply()函數(shù)默認(rèn)返回的是一個(gè)矩陣,而lapply()函數(shù)返回的時(shí)一個(gè)列表。其實(shí),在sapply()函數(shù)中如果返回的長(zhǎng)度不一樣不能生成矩陣時(shí),才會(huì)生成一個(gè)列表。

> x1

$a1

[1] 1 2 3 4 5 6 7 8


$a2

[1]  TRUE FALSE FALSE  TRUE  TRUE

這里自定義函數(shù)f()返回參數(shù)本身,x中兩列不一樣長(zhǎng),返回類型就為列表。


4、tapply函數(shù)

前面介紹的apply()、lapply()、sapply()函數(shù)提供的分組循環(huán)方式都很簡(jiǎn)單,tapply()函數(shù)提供了更強(qiáng)大、更靈活的循環(huán)方式,可能也更難以理解。

例一

> a<-as.factor(c(1,1,2,3,3))

> a

[1] 1 1 2 3 3

Levels: 1 2 3

> tapply(a,a,length)

1 2 3 

2 1 2 

這里tapply()函數(shù)有三個(gè)參數(shù),第一個(gè)參數(shù)指定因子類型a為被循環(huán)對(duì)象,第二個(gè)參數(shù)指定a為指針參數(shù),第三個(gè)參數(shù)指定應(yīng)用的函數(shù)為求長(zhǎng)度函數(shù)length,這里由于a的因子水平為3,故tapply()函數(shù)循環(huán)了三次,分別求出三個(gè)水平的出現(xiàn)次數(shù)。

例二

這里以warpbreaks數(shù)據(jù)集為例

> head(warpbreaks)

breaks wool tension

1     26    A       L

2     30    A       L

3     54    A       L

4     25    A       L

5     70    A       L

6     52    A       L

> summary(warpbreaks[,c(2:3)])

wool   tension

A:27   L:18   

B:27   M:18   

H:18

warpbreaks的wool變量有兩個(gè)分類,tension有三個(gè)分類。

> tapply(warpbreaks$breaks,warpbreaks[-1],sum)

tension

wool   L   M   H

A 401 216 221

B 254 259 169

這里以warpbreaks的breaks變量作為應(yīng)用對(duì)象,除去第一列(warpbreaks[-1])作為指針參數(shù),第三個(gè)參數(shù)是應(yīng)用求和函數(shù)。這里函數(shù)作用相當(dāng)于一個(gè)分類匯總的功能wool有兩個(gè)變量,tension有三個(gè)變量,一共有2x3 = 6種組合。比如wool = A,tension = L時(shí)求和所有breaks就是401。我們可以檢驗(yàn)一下如下:

> sum(warpbreaks[which((warpbreaks$wool=='A')&warpbreaks$tension == 'L'),1])

[1] 401

顯然,wool = A,tension = L時(shí)求和所有breaks就是401。


5、mapply函數(shù)

mapply()函數(shù)與tapply()函數(shù)還是比較相似的,不過與其它apply家族的函數(shù)相比,mapply()函數(shù)的另一個(gè)特點(diǎn)是它的參數(shù)順序與其它函數(shù)恰好相反。

例一

> mapply(rep,1:4,4:1)

[[1]]

[1] 1 1 1 1

[[2]]

[1] 2 2 2

[[3]]

[1] 3 3

[[4]]

[1] 4

這里mapply()函數(shù)有三個(gè)參數(shù),第一個(gè)指定應(yīng)用的 函數(shù)為rep,就是重復(fù)函數(shù);第二個(gè)參數(shù)指定被應(yīng)用的對(duì)象為序列4:1,第三個(gè)參數(shù)指定重復(fù)的次數(shù)分別為1:4,即4要重復(fù)一次,3要重復(fù)兩次等。數(shù)據(jù)分析師培訓(xùn)

例二

mapply(function(x,y) seq_len(x)+y,c(1,2,3),c(10,20,30))

[[1]]

[1] 11

[[2]]

[1] 21 22

[[3]]

[1] 31 32 33

這里自定義了一個(gè)函數(shù)seq_len(x)+y,其中seq_len(x)函數(shù)作用是生成一個(gè)1:X的序列,比如:

> seq_len(3)

[1] 1 2 3

那么對(duì)c(1,2,3)就會(huì)依次生成1,1:2,1:3的序列,再分別加上10,20,30,就會(huì)得到那樣的結(jié)果了。

可以看出,mapply()函數(shù)主要是對(duì)中間對(duì)象元素與第三個(gè)對(duì)象元素一一對(duì)應(yīng),分別應(yīng)用前面的指定函數(shù)。


數(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ù)說明請(qǐng)參見: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); }