11

reshape2::melt私はかなり非標準的な方法で を長年使用してきました。数値実験を実行して、結果として行列を取得しています。次に、それを溶かしていくつかの画像を作成します。

との類似性に触発されて、クラス マトリックスのオブジェクトで同一の出力を達成しようとしています。これまでのところ運が悪い:reshape2tidyr

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私はそれがどのように機能するかを学んだので、次の関数をメソッドディスパッチに追加できる可能性があります。

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?

4

1 に答える 1

12

おそらくより良い答えが出てくるでしょうが、それまでの間、コメントを答えに変換します。

README から「tidyr」への引用:

tidyr は dplyr と組み合わせて使用​​するように設計されているため、常に両方をロードする必要があります。

...そしてREADMEから「dplyr」まで:

dplyr は plyr の次の反復であり、データ フレームを操作するためのツールに焦点を当てています (したがって、d名前に が含まれています)。

そのため、行列のメソッドを持たないことは理かなっています。


gatherすでにラップアラウンドしているためmelt、本当にmatrixメソッドが必要な場合は、カスタム関数を作成して節約し、次のようにすることができます。

gather.matrix <- reshape2:::melt.matrix
于 2015-04-03T10:44:24.143 に答える