熱線電話:13121318867

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

R語言數據集行列互換技巧

現在給大家介紹的數據處理技巧是長轉寬,也就相當于Excel中的轉置,不過用R語言實現的長轉寬還有數據合并的功能,自然比Excel強大多了。

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

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

輸出結果
[python] view plain copy

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

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

    #長轉寬——dcast  
    dcast(  
      data=mydata1,  
      name+address~Year  
      #左側是要保留的字段,右側是要分割的分類變量,列數等于表達式  
      #右側分類變量的類別個數  
    )  

[python] view plain copy

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

    #長轉寬——spread  
    tidyr::spread(  
      data=mydata1,  
      key=Year,  
      value=sale  
    )  

[python] view plain copy

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


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

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

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢