如何用R來處理數據表的長寬轉換(圖文詳解)


 

 

 不多說,直接上干貨!

 

 

  很多地方都需用到這個知識點,比如Tableau里。   通常可以采取如python 和 r來作為數據處理的前期。

Tableau學習系列之Tableau如何通過數據透視表方式讀取數據文件(圖文詳解)

如何用Python來處理數據表的長寬轉換(圖文詳解)

 

 

 

 

  數據長寬轉換是很常用的需求,特別是當是從Excel中導入的匯總表時,常常需要轉換成一維表(長數據)才能提供給圖表函數或者模型使用。

 

在R語言中,提供數據長寬轉換的包主要有兩個:

  • reshape2::melt/dcast
  • tidyr::gather/spread

 

library("reshape2")
library("tidyr")

 

mydata<-data.frame(
       Name = c("蘋果","谷歌","臉書","亞馬遜","騰訊"),
       Conpany = c("Apple","Google","Facebook","Amozon","Tencent"),
       Sale2013 = c(5000,3500,2300,2100,3100),
       Sale2014 = c(5050,3800,2900,2500,3300),
       Sale2015 = c(5050,3800,2900,2500,3300),
       Sale2016 = c(5050,3800,2900,2500,3300)
       )

 

 

 

 

 

 

 

 

 

 

數據重塑(寬轉長):

  melt函數是reshape2包中的數據寬轉長的函數

mydata<-melt(
       mydata,                       #待轉換的數據集名稱
       id.vars=c("Conpany","Name"),  #要保留的主字段
       variable.name="Year",         #轉換后的分類字段名稱(維度)
       value.name="Sale"             #轉換后的度量值名稱
       )

    轉換之后,長數據結構保留了原始寬數據中的Name、Conpany字段,同時將剩余的年度指標進行堆棧,轉換為一個代表年度的類別維度和對應年度的指標。(即轉換后,所有年度字段被降維化了)。

 

 

 

 

 1、在tidyr包中的gather也可以非常快捷的完成寬轉長的任務:

data1<-gather(
      data=mydata,      #待轉換的數據集名稱
      key="Year",       #轉換后的分類字段名稱(維度)
      value="Sale" ,    #轉換后的度量值名稱
      Sale2013:Sale2016 #選擇將要被拉長的字段組合
      )               #(可以使用x:y的格式選擇連續列,也可以以-z的格式排除主字段)

 

  而相對於數據寬轉長而言,數據長轉寬就顯得不是很常用,因為長轉寬是數據透視,這種透視過程可以通過匯總函數或者類數據透視表函數來完成。

  但是既然數據長寬轉換是成對的需求,自然有對應的長轉寬函數。

 

 

 

 

 

 

 

 

2、reshape2中的dcast函數可以完成數據長轉寬的需求:

dcast(
   data=data1,         #數據集名稱
   Name+Conpany~Year   #x1+x2+……~class 
   #這一項是一個轉換表達式,表達式左側列       
   #出要保留的主字段(即不會被擴寬的字段,右側則是要分割的分類變量,擴展之后的       
   #寬數據會增加若干列度量值,列數等於表達式右側分類變量的類別個數
  )

 

 

 

 

 

除此之外,tidyr包中的spread函數在解決數據長轉寬方面也是很好的一個選擇。

  spread:

spread(
   data=data1,   #帶轉換長數據框名稱
   key=Year,     #帶擴寬的類別變量(編程新增列名稱)  
   value=Sale)   #帶擴寬的度量值 (編程新增列度量值)

 

 

 

 

 

 

    從以上代碼的復雜度來看,reshape2內的兩個函數melt\dcast和tidyr內的兩個函數gather\spread相比,gather\spread這一對函數完勝,不愧是哈神的最新力作,tidyr內的兩個函數所需參數少,邏輯上更好理解,自始至終都圍繞着data,key、value三個參數來進行設定,而相對老舊的包reshape2內的melt\dcast函數在參數配置上就顯得不是很友好,他是圍繞着一直不變的主字段來進行設定的,tidyr包則圍繞着轉換過程中會變形的維度和度量來設定的。

 

 

 

 

 

 

 

 

 

歡迎大家,加入我的微信公眾號:大數據躺過的坑        人工智能躺過的坑
 
 
 

同時,大家可以關注我的個人博客

   http://www.cnblogs.com/zlslch/   和     http://www.cnblogs.com/lchzls/      http://www.cnblogs.com/sunnyDream/   

   詳情請見:http://www.cnblogs.com/zlslch/p/7473861.html

 

  人生苦短,我願分享。本公眾號將秉持活到老學到老學習無休止的交流分享開源精神,匯聚於互聯網和個人學習工作的精華干貨知識,一切來於互聯網,反饋回互聯網。
  目前研究領域:大數據、機器學習、深度學習、人工智能、數據挖掘、數據分析。 語言涉及:Java、Scala、Python、Shell、Linux等 。同時還涉及平常所使用的手機、電腦和互聯網上的使用技巧、問題和實用軟件。 只要你一直關注和呆在群里,每天必須有收獲

 

      對應本平台的討論和答疑QQ群:大數據和人工智能躺過的坑(總群)(161156071) 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM