我們在做數據分析的時候,對數據進行操作也是一項極其重要的內容,這里我們同樣介紹強大包reshape2,其中的幾個函數,對數據進行操作cast和melt兩個函數絕對少不了。
首先是cast,把長型數據轉換成你想要的任何寬型數據,
dcast(data, formula, fun.aggregate = NULL, ..., margins = NULL, subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))
acast(data, formula, fun.aggregate = NULL, ..., margins = NULL, subset = NULL, fill = NULL, drop = TRUE, value.var = guess_value(data))
參數:
data 要進行轉換的數據框
formula 用於轉換的公式
fun.aggregate 聚合函數,表達式為:行變量~列變量~三維變量~......,另外,.表示后面沒有數據列,…表示之前或之后的所有數據列
margins 用於添加邊界匯總數據
subset 用於添加過濾條件,需要載入plyr包
其他三個參數,用到的情況相對較少。
下面來看些具體的例子
先構建一個數據集
x<-data.frame(id=1:6, name=c("wang","zhang","li","chen","zhao","song"), shuxue=c(89,85,68,79,96,53), yuwen=c(77,68,86,87,92,63))
x
先使用melt函數對數據進行融化操作。
library(reshape2)
x1<-melt(x,id=c("id","name")) x1
可以看到數據已經變成了長型數據(melt函數后面詳細介紹)。
接下來就是對數據進行各種變型操作了。
acast(x1,id~variable)
dcast(x1,id~variable)
從以上兩個執行結果來看,可以看出acast和dcast的區別
這里acast輸出結果省略了id這個列,而dcast則輸出id列
acast(x1,id~name~variable)
三維的情況下acast輸出的是一個數組,而dcast則報錯,因為dcast輸出結果為數據框。
dcast(x1,id~variable,mean,margins=T)
可以看到,邊緣多了兩列匯總數據是對行列求平均的結果。
dcast(x1,id~variable,mean,margins=c("id"))
只對列求平均值,當然也可以只對行求平均值,把id改成variable就可以了。
library(plyr) dcast(x1,id~variable,mean,subset=.(id==1|id==3))
這里subset的篩選功能強大可以進行各種各樣的篩選操作,類似filter的作用。
dcast(x1,id+name~variable)
數據還原成原來的樣子了。
dcast(x1,variable~name)
對行列進行對調。
acast(x1,variable~id+name)
到這里,我們已經着實體會了cast的強大,數據幾乎可以轉換成任何形式。
跟excel中的數據透視表功能類似。