R語言之數據重塑
向數據框中添加新的列,以數據集Loblolly為例。
該數據集包含了各種樹的高度和年齡,以下通過三種方式加以實現新增變數:
方法一:使用一個$符
方法二:within函數 必須在新添加的變數中加上花括弧
方法三:transform函數
刪除數據框中的某一列:建議使用subset函數,只需在刪除的列前添加負號即可。
更改數據框中所有數值變數的值,可以考慮結合使用apply函數和sapply函數。例如,現在想對x1和x2的列進行轉換,轉換為原來值的平方再對數。
變數的重編碼:即根據已有的變數重新編碼,如連續變數的離散化。例如,現在想把data9中的x變數重編碼,x<13則編碼為1,x>=13且x<15則編碼為2,剩餘的編碼為3。
實際上R中有專門的重編碼函數,car包中recode的函數可以非常靈活的對某個已有的變數進行重新編碼。但我覺得在對連續變數進行分組操作時顯得有點不方便,對於區間[1.2,5.5)表示成『1.2:5.5 = 1』,但該函數會把5.5分配到該區間中。
library(car)
語法:
recode(var, recodes, as.factor.result, as.numeric.result=TRUE, levels)
var為一個數值向量,recodes為重編碼的規則。
對於變數的重編碼問題,相比較within和recode函數,我個人更喜歡使用within函數。
有時在數據處理過程中需要將長型數據框轉化為寬型數據框或者將寬型數據框轉換為長型數據框。
寬型數據框:一個觀測(id)記錄在一行中,沒有重複的id出現
長型數據框:一個觀測(id)記錄在多行中,會有重複的id出現
例如以下的數據框df1為寬型,df2為長型
對於寬型數據框轉換為長型數據框可以使用reshape2包中的melt函數
對於長型數據框轉化為寬型數據框可以使用stats包中的reshape函數。
reshape函數需要至少5個參數,第一個參數為被重塑的數據框,第二個參數通過v.names指定非分組變數或觀測值,第三個參數timevar指定分組變數或因子,第四個參數idvar指定重複出現的觀測單位,最後一個參數direction指定轉換的類型,其值為"wide"和"long"兩種。當然可能用到drop參數,指定不需要的觀測值變數。
再舉一個例子,現在是兩個觀測變數x和y,將長型數據框變為寬型數據框
但發現這樣的寬型數據框的列x和y是交錯重複出現的,為了x和y分開存放,可以結合一下melt和cast函數。
注意這裡派生列的名稱是按公式中右邊變數輸入的順序建立的
數據框的合併
普通情況下一般重用的有rbind函數、cbind函數和merge函數。這裡重點介紹一下plyr包中的join函數,該函數在合併數據框時非常的方便,類似於資料庫語言中的表連接。
語法:
join(x, y, by = NULL, type = "left", match = "all")
其中x和y是被要合併的數據框;by為x和y中的連接欄位;type為合併類型,有左連、右連、內連和全連四種;match用來數據合併過程中重複值的處理,默認情況下不排除重複值,當指定first時,則保留重複值中的第一個。
下面首先建立兩個數據框。
接下來看一看join函數是如何合併數據框的。
左連和右連:
內連和全連
其實這裡的join函數,跟資料庫中的表連接是一個意思。
以上是對數據框的常見操作,最後再對用到的R包和函數做一個總結:
stats包
with()
within()
transform()
subset()
reshape()
rbind()
cbind()
merge()
car包
recode()
reshape包
melt()
cast()
plyr包
rename()
join()
----------------------------------------------
作者:劉順祥
出處:劉順祥博客
公眾號:每天進步一點點2015
大家也可以加小編微信:tswenqu,進R語言中文社區 交流群,可以跟各位老師互相交流
推薦閱讀:
※大數據驅動的人工智慧時代,如何成為2%不被淘汰的人?
※假如海平面上升100米中國會怎麼樣?
※2017年數據分析實踐計劃
※鏈家網大數據平台建設,平台樞紐——工具鏈
※大數據的本質是消除不確定性