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

熱線電話:13121318867

登錄
首頁精彩閱讀R語言數(shù)據(jù)集行列互換技巧
R語言數(shù)據(jù)集行列互換技巧
2018-06-24
收藏

R語言數(shù)據(jù)集行列互換技巧

現(xiàn)在給大家介紹的數(shù)據(jù)處理技巧是長(zhǎng)轉(zhuǎn)寬,也就相當(dāng)于Excel中的轉(zhuǎn)置,不過用R語言實(shí)現(xiàn)的長(zhǎng)轉(zhuǎn)寬還有數(shù)據(jù)合并的功能,自然比Excel強(qiáng)大多了。

這里給大家介紹4個(gè)函數(shù),其中melt()、dcast()來自reshape2包,gather()、spread()來自tidyr包
一、寬轉(zhuǎn)長(zhǎng)——melt()、gather()
[python] view plain copy

    mydata<-data.frame(  
      name=c("store1","store2","store3","store4"),  
      address=c("普陀區(qū)","黃浦區(qū)","徐匯區(qū)","浦東新區(qū)"),  
      sale2014=c(3000,2500,2100,1000),  
      sale2015=c(3020,2800,3900,2000),  
      sale2016=c(5150,3600,2700,2500),  
      sale2017=c(4450,4100,4000,3200)  
    )  
    #寬轉(zhuǎn)長(zhǎng)——melt  
    mydata1<-melt(  
      mydata,  
      id.vars=c("address","name"),#要保留的主字段  
      variable.name = "Year",#轉(zhuǎn)換后的分類字段名稱(維度)  
      value.name = "Sale" #轉(zhuǎn)換后的度量值名稱  
    )  

輸出結(jié)果
[python] view plain copy

    > mydata1<-melt(  
    +   mydata,  
    +   id.vars=c("address","name"),#要保留的主字段  
    +   variable.name = "Year",#轉(zhuǎn)換后的分類字段名稱(維度)  
    +   value.name = "Sale" #轉(zhuǎn)換后的度量值名稱  
    + )  
    > mydata1  
        address   name     Year Sale  
    1    普陀區(qū) store1 sale2014 3000  
    2    黃浦區(qū) store2 sale2014 2500  
    3    徐匯區(qū) store3 sale2014 2100  
    4  浦東新區(qū) store4 sale2014 1000  
    5    普陀區(qū) store1 sale2015 3020  
    6    黃浦區(qū) store2 sale2015 2800  
    7    徐匯區(qū) store3 sale2015 3900  
    8  浦東新區(qū) store4 sale2015 2000  
    9    普陀區(qū) store1 sale2016 5150  
    10   黃浦區(qū) store2 sale2016 3600  
    11   徐匯區(qū) store3 sale2016 2700  
    12 浦東新區(qū) store4 sale2016 2500  
    13   普陀區(qū) store1 sale2017 4450  
    14   黃浦區(qū) store2 sale2017 4100  
    15   徐匯區(qū) store3 sale2017 4000  
    16 浦東新區(qū) store4 sale2017 3200 
再來看看gather()函數(shù)怎么用
[python] view plain copy

    > #寬轉(zhuǎn)長(zhǎng)——gather  
    > mydata1<-tidyr::gather(  
    +   data=mydata,  
    +   key="Year",  
    +   value="sale",  
    +   sale2014:sale2017  
    + )  
    > mydata1  
         name  address     Year sale  
    1  store1   普陀區(qū) sale2014 3000  
    2  store2   黃浦區(qū) sale2014 2500  
    3  store3   徐匯區(qū) sale2014 2100  
    4  store4 浦東新區(qū) sale2014 1000  
    5  store1   普陀區(qū) sale2015 3020  
    6  store2   黃浦區(qū) sale2015 2800  
    7  store3   徐匯區(qū) sale2015 3900  
    8  store4 浦東新區(qū) sale2015 2000  
    9  store1   普陀區(qū) sale2016 5150  
    10 store2   黃浦區(qū) sale2016 3600  
    11 store3   徐匯區(qū) sale2016 2700  
    12 store4 浦東新區(qū) sale2016 2500  
    13 store1   普陀區(qū) sale2017 4450  
    14 store2   黃浦區(qū) sale2017 4100  
    15 store3   徐匯區(qū) sale2017 4000  
    16 store4 浦東新區(qū) sale2017 3200 
和melt()函數(shù)不同,gather()函數(shù)需要指定關(guān)鍵字段key,以及關(guān)鍵字段對(duì)應(yīng)的值value,但是gather()函數(shù)更加好理解。
二、長(zhǎng)轉(zhuǎn)寬——dcast()和spread()
還是用上面的data1數(shù)據(jù)集,先來看看dcast()函數(shù)
[python] view plain copy

    #長(zhǎng)轉(zhuǎn)寬——dcast  
    dcast(  
      data=mydata1,  
      name+address~Year  
      #左側(cè)是要保留的字段,右側(cè)是要分割的分類變量,列數(shù)等于表達(dá)式  
      #右側(cè)分類變量的類別個(gè)數(shù)  
    )  

[python] view plain copy

    > #長(zhǎng)轉(zhuǎn)寬——dcast  
    > dcast(  
    +   data=mydata1,  
    +   name+address~Year  
    +   #左側(cè)是要保留的字段,右側(cè)是要分割的分類變量,列數(shù)等于表達(dá)式  
    +   #右側(cè)分類變量的類別個(gè)數(shù)  
    + )  
    Using sale as value column: use value.var to override.  
        name  address sale2014 sale2015 sale2016 sale2017  
    1 store1   普陀區(qū)     3000     3020     5150     4450  
    2 store2   黃浦區(qū)     2500     2800     3600     4100  
    3 store3   徐匯區(qū)     2100     3900     2700     4000  
    4 store4 浦東新區(qū)     1000     2000     2500     3200 
dcast()函數(shù)的使用規(guī)則需要琢磨下才能理解,大家好好看看注釋部分,再來看看spread()
[python] view plain copy

    #長(zhǎng)轉(zhuǎn)寬——spread  
    tidyr::spread(  
      data=mydata1,  
      key=Year,  
      value=sale  
    )  

[python] view plain copy

    > #長(zhǎng)轉(zhuǎn)寬——spread  
    > tidyr::spread(  
    +   data=mydata1,  
    +   key=Year,  
    +   value=sale  
    + )  
        name  address sale2014 sale2015 sale2016 sale2017  
    1 store1   普陀區(qū)     3000     3020     5150     4450  
    2 store2   黃浦區(qū)     2500     2800     3600     4100  
    3 store3   徐匯區(qū)     2100     3900     2700     4000  
    4 store4 浦東新區(qū)     1000     2000     2500     3200 
直接調(diào)用tidyr::spread,需要指定關(guān)鍵字段key和對(duì)應(yīng)的值value。
但是從理解上來看,我個(gè)人更喜歡tidyr包的函數(shù),使用很清晰,大家可以根據(jù)實(shí)際情況自行選擇,好啦,今天的分享結(jié)束,下次再見!


數(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); }