前面一篇講了cast,想必已經見識到了reshape2的強大,當然在使用cast時配合上melt這種強大的揉數據能力才能表現的淋漓盡致。
下面我們來看下,melt這個函數以及它的特點。
melt(data, ..., na.rm = FALSE, value.name = "value")
從這里來看函數的參數也相對比較簡單,data表示要處理的數據,na.rm表示缺失值處理辦法,value.name用於重命名值所在列的名稱
另外,melt函數的難點在於,不同數據結構,用到的參數可能是不一樣的。
首先,要融合的數據為數組、表以及矩陣,那么melt的表達式為:
melt(data, varnames = names(dimnames(data)), ..., na.rm = FALSE, as.is = FALSE, value.name = "value")
varnames用戶命名變量名稱
其次,要融合的數據為數據框,那么melt的表達式為:
melt(data, id.vars, measure.vars, variable.name = "variable", ..., na.rm = FALSE, value.name = "value", factorsAsStrings = TRUE)
id.vars 設置融合后單獨顯示的變量,可以用變量位置及名稱表示,沒寫表示使用所有非measure.vars值
measure.vars 通常根據id.vars 設置的變化而變化
最后,要融合的數據為列表,那么melt的表達式為:
melt(data, ..., level = 1)
下面來看些具體的例子
data<- array(c(1:22, NA,"wo"), c(2,3,4)) data
melt(data)
可以看出數據融合后,可讀性比數組的情況下強了好多,var1表示數組的行,var2表示數組的列,var3表示數組序列。
比如,18位置就是第3數組,2行3列的位置,11則是第2數組,1行3列。
melt(a, na.rm = TRUE)
可以看到數組中的缺失值被移除了。
melt(data, varnames=c("hang","lie","Zu"))
對融合后的每個變量進行重命名。
下面來看下數據為數據框的情況。
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(x,id=c("id","name"))
melt(x,id=1:2,variable.name="kemu",value.name="zhi")
melt(x,measure.vars=c("id","name"))
最后,來看下如果數據是列表的情況
shuju<- list(matrix(1:4, ncol=2), array(1:27, c(3,3,3)))
shuju
這個列表的機構比較復雜,讀起來有點難度
下面melt融合后的結果
melt(shuju)
可以看出數據變得非常簡潔。