不多說,直接上干貨!
很多地方都需用到這個知識點,比如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)