2015-04-03 68 views
8

我一直以很不標準的方式使用reshape2::melt的長時間用戶:我正在運行數值實驗並得到一個矩陣。然後我將它融化併產生一些圖像。tidyr :: gather與reshape2 ::在矩陣上融化

受到reshape2tidyr之間的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?有沒有可以在matmat2上產生所需輸出的參數組合?

+0

考慮到「tidyr是專爲使用與dplyr結合「,並且」dplyr「是」專注於處理數據框架的工具「,我認爲你可能會更好地堅持使用」熔化「(因爲無論如何,」聚集「似乎是」熔化「的封裝)。 – A5C1D2H2I1M1N2O1R2T1 2015-04-03 09:40:31

+0

@AnandaMahto我傾向於這樣做,只是想知道我是否錯過了一些明顯的東西:) – tonytonov 2015-04-03 09:47:23

+1

如果真的需要'gather'方法,那麼我想保存好自己的重寫然後執行'gather.matrix < - reshape2 ::: melt.matrix' .... :-) – A5C1D2H2I1M1N2O1R2T1 2015-04-03 10:21:25

回答

11

也許一個更好的答案會出現,但在此期間,我會轉換我的意見答案:

自述爲「tidyr」引用:

注意tidyr設計與dplyr一起使用,所以你應該總是加載兩者。

...和自述爲「dplyr」:

dplyr是plyr的下一個迭代,側重於工具與數據幀的工作(因此d的名稱)。

因此,它排序是有意義的,沒有矩陣的方法。


由於gather已經環繞melt,如果你真的想要一個matrix方法,你可以節省自己編寫自定義的功能,只是這樣做:

gather.matrix <- reshape2:::melt.matrix