我一直以很不標準的方式使用reshape2::melt
的長時間用戶:我正在運行數值實驗並得到一個矩陣。然後我將它融化併產生一些圖像。tidyr :: gather與reshape2 ::在矩陣上融化
受到reshape2
和tidyr
之間的similarity的啓發,我現在試圖在類矩陣的對象上實現相同的輸出。至今沒有運氣:
library(reshape2)
library(tidyr)
set.seed(42)
mat <- matrix(runif(6), 3)
mat2 <- mat
colnames(mat2) <- letters[1:2]
rownames(mat2) <- letters[3:5]
melt(mat)
melt(mat2)
gather(mat) # fails
gather(mat2) # fails
注意melt
是聰明的,並保持dimnames
如果它們存在。我已經學會how it works,所以我有可能添加的功能的方法分派:
gather.matrix <- function(mat) {
if (is.null(dimnames(mat))) {
grid <- expand.grid(seq.int(nrow(mat)), seq.int(ncol(mat)))
} else {
grid <- expand.grid(dimnames(mat))
}
cbind(grid, value = as.vector(mat))
}
all.equal(melt(mat),
gather.matrix(mat))
#[1] TRUE
all.equal(melt(mat2),
gather.matrix(mat2))
#[1] TRUE
但問題是,我可以強制gather
行爲以同樣的方式在我的情況下melt
?有沒有可以在mat
和mat2
上產生所需輸出的參數組合?
考慮到「tidyr是專爲使用與dplyr結合「,並且」dplyr「是」專注於處理數據框架的工具「,我認爲你可能會更好地堅持使用」熔化「(因爲無論如何,」聚集「似乎是」熔化「的封裝)。 – A5C1D2H2I1M1N2O1R2T1 2015-04-03 09:40:31
@AnandaMahto我傾向於這樣做,只是想知道我是否錯過了一些明顯的東西:) – tonytonov 2015-04-03 09:47:23
如果真的需要'gather'方法,那麼我想保存好自己的重寫然後執行'gather.matrix < - reshape2 ::: melt.matrix' .... :-) – A5C1D2H2I1M1N2O1R2T1 2015-04-03 10:21:25