1. ホーム
  2. r

[解決済み] 3 列のデータフレームを行列に整形する("long" から "wide" 形式) [重複].

2022-05-29 10:14:15

質問

を持つ data.frame のようなものがあります。

x a 1 
x b 2 
x c 3 
y a 3 
y b 3 
y c 2 

これをヒートマップに与えてプロットできるように、行列形式にしたいのです。 結果は次のようなものになるはずです。

    a    b    c
x   1    2    3
y   3    3    2

私が試したのは cast を試してみたり、これを行うための手動関数を書いてみたりしましたが、うまくいかないようです。

どのように解決するのですか?

多くの方法があります。 この回答は、すぐに標準的な方法になりつつあるものを始めとして、古い方法や、このサイトに散らばっている同様の質問に対する回答から、様々な方法を紹介しています。

tmp <- data.frame(x=gl(2,3, labels=letters[24:25]),
                  y=gl(3,1,6, labels=letters[1:3]), 
                  z=c(1,2,3,3,3,2))

tidyverseを使用する。

これを行うクールな新しい方法は pivot_wider から tidyr 1.0.0 . これはデータフレームを返すもので、おそらくこの答えの読者のほとんどが望むものでしょう。しかし、ヒートマップのためには、これを真の行列に変換する必要があります。

library(tidyr)
pivot_wider(tmp, names_from = y, values_from = z)
## # A tibble: 2 x 4
## x         a     b     c
## <fct> <dbl> <dbl> <dbl>
## 1 x       1     2     3
## 2 y       3     3     2

これを行うための古いクールな新しい方法は spread から tidyr . 同様にデータフレームを返します。

library(tidyr)
spread(tmp, y, z)
##   x a b c
## 1 x 1 2 3
## 2 y 3 3 2

reshape2の使用 :

Tidyverseへの最初のステップの1つはreshape2パッケージでした。

行列を得るには acast :

library(reshape2)
acast(tmp, x~y, value.var="z")
##   a b c
## x 1 2 3
## y 3 3 2

また、データフレームを取得する場合は dcast を使うこともできます。 1列の値のためにデータを再形成する .

dcast(tmp, x~y, value.var="z")
##   x a b c
## 1 x 1 2 3
## 2 y 3 3 2

plyrの使用 :

reshape2とtidyverseの間に来たのは plyr と共に daply 関数を使うことで、このように https://stackoverflow.com/a/7020101/210673

library(plyr)
daply(tmp, .(x, y), function(x) x$z)
##    y
## x   a b c
##   x 1 2 3
##   y 3 3 2

マトリックスインデックスを使用します。

これはちょっと古いですが、特定の状況で本当に役に立つことができるマトリックスインデックスの素晴らしいデモです。

with(tmp, {
  out <- matrix(nrow=nlevels(x), ncol=nlevels(y),
                dimnames=list(levels(x), levels(y)))
  out[cbind(x, y)] <- z
  out
})

使用方法 xtabs :

xtabs(z~x+y, data=tmp)

疎な行列を使用する。

また sparseMatrix の中に Matrix パッケージの中で、このように R - BIGテーブルを列名で行列に変換する

with(tmp, sparseMatrix(i = as.numeric(x), j=as.numeric(y), x=z,
                       dimnames=list(levels(x), levels(y))))
## 2 x 3 sparse Matrix of class "dgCMatrix"
##   a b c
## x 1 2 3
## y 3 3 2

使用方法 reshape :

また、Rの基本関数である reshape を使うこともできます。 列名によって表を行列に変換する ただし、余分な列を削除して名前を正しくするために、後で少し操作する必要があります (表示されません)。

reshape(tmp, idvar="x", timevar="y", direction="wide")
##   x z.a z.b z.c
## 1 x   1   2   3
## 4 y   3   3   2