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

熱線電話:13121318867

登錄
首頁精彩閱讀R中的apply族函數(shù)
R中的apply族函數(shù)
2017-02-19
收藏

R中的apply族函數(shù)

如果計算涉及到 一個單一的向量,而結果也是一個向量 , tapply函數(shù) 是一個可選項,不同于aggregate函數(shù),它返回一個向量或數(shù)組,這使得其單個元素很容易被訪問。

將組定義為矩陣的行或列,即操作目標為矩陣的每一列或行時, apply函數(shù) 時最佳選擇。該函數(shù)通常會返回一個向量或數(shù)組,但根據(jù)行或列操作的結果維度不同,將返回一個列表。

將組定義為列表中的元素。 如果組已經(jīng)形成列表元素,那么 sapply或lapply函數(shù) 比較適合,它們的區(qū)別是lapply返回一個列表,而sapply可將輸出簡化為向量或數(shù)組。有時可以結合使用split函數(shù),將需要處理的數(shù)據(jù)創(chuàng)建為一個列表,然后再使用這兩個函數(shù)。

如果所要計算函數(shù)的參數(shù)為一個矩陣或數(shù)組, 可以考慮使用 mapply函數(shù) ,該函數(shù)非常的靈活和簡單,其返回的結果一般是列表形式。

先來看一下tapply()、apply()、lapply()、sapply()和mapply()函數(shù)的 語法規(guī)則:

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

apply(X, MARGIN, FUN, ...)

lapply(X, FUN, ...)

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,

USE.NAMES = TRUE)

根據(jù)不同的函數(shù),輸入數(shù)據(jù)X可能是向量、數(shù)組、矩陣或數(shù)據(jù)框;INDEX一般為類別變量;MARGIN指定矩陣的維度,1表示矩陣的行,2表示矩陣的列;FUN為參與運算的函數(shù),可以是R自帶的函數(shù)也可以是自己編寫的函數(shù);...為函數(shù)FUN指定的參數(shù),緊跟在函數(shù)的后面。

接下來看一下各個函數(shù)的應用情況

為了處理基于一個或多個分組變量的單個向量,可以使用tapply函數(shù), 該函數(shù)返回一個數(shù)組,其維數(shù)與分組向量的維數(shù)相同 。

注意,該函數(shù)的輸入數(shù)據(jù)必須是向量,且分析向量與分組向量的長度必須一致

如果想分析iris數(shù)據(jù)集中Sepal.Length在各個花種中的最大值,可以通過tapply函數(shù)實現(xiàn),這里的Sepal.Length和Species為兩個向量,且各自的長度均相等。

如果想對某個變量(向量)進行多變量的分組分析時,也可以采用tapply函數(shù)。

首先構造一個數(shù)據(jù)框:

接下來想對z變量做分組統(tǒng)計,分組變量為x和y

 這里的NA表示x和y的分組中沒有對應的z值。

當數(shù)據(jù)具備 數(shù)組 的特性,可通過 apply函數(shù)對數(shù)據(jù)的每個維度進行運算 ,該函數(shù)需要 三個參數(shù) :需要計算的 數(shù)組、運算維度的索引號和使用的函數(shù)。

標準化一個矩陣:這里可以直接給參數(shù)FUN為scale

當然,如果想統(tǒng)計各個列的均值,為比較顯式循環(huán)和apply的隱式循環(huán),程序如下,就可以比較出兩種方式的效率:

\

結果顯式,通過apply計算矩陣列的均值速度是顯式循環(huán)的50倍。這說明在R中使用循環(huán)的話盡量使用到隱式的向量化計算,否則計算效率非常差。

再來看一個如何使用自編函數(shù)應用到apply中:這里顯式了前7列的統(tǒng)計量值。

lapply()函數(shù)和sapply()函數(shù)把一個列表或向量作為其第一個參數(shù),再把需要應用到每個列表元素的函數(shù)作為它的第二個參數(shù)。 其實它也應用到了循環(huán),是一種隱式的循環(huán),對列表的每一個元素做同樣的函數(shù)計算。

應用:查看字符向量中每一個元素所包含的單詞個數(shù)

使用sapply函數(shù)的另一個重要問題涉及到數(shù)據(jù)框。當數(shù)據(jù)框被視為列表時,數(shù)據(jù)框的每一列看著獨立的列表元素。

查看數(shù)據(jù)集iris和ChickWeight各個字段的模式和類

通過以上的應用,可以提取滿足特定條件的數(shù)據(jù)框的列

接下來使用自編函數(shù)加入到sapply函數(shù)中,實現(xiàn)循環(huán)。該自編函數(shù)的目的是計算出1000個100*5的矩陣中最大相關系數(shù)的均值。 這里很關鍵的一點是給自編函數(shù)傳一個虛擬參數(shù)i用來循環(huán)。

最后再來看一下mapply函數(shù)的應用:該函數(shù)的第一個參數(shù)為指定的函數(shù),第二個參數(shù)為指定函數(shù)的參數(shù)。如果根據(jù)某種正則表達式將一個字符向量的對應特征取出來,例如取出'qaws1few4g'中的'1f'和'4g'

最后總結一下:

tapply()的被分析對象必須且只能是向量

apply()的被分析對象必須且只能是矩陣或數(shù)組

sapply()的被分析對象必須且只能是向量或列表

lapply()的被分析對象必須且只能是向量或列表

mapply()的被分析對象必須是函數(shù)


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

若不方便掃碼,搜微信號: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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見: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); }