[解決済み] 3 列のデータフレームを行列に整形する("long" から "wide" 形式) [重複].
質問
を持つ
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
関連
-
RStudio の "plot.new() : figure margins too large" 問題を解決する。
-
[解決策】 plot.new() のエラー:図の余白が大きすぎる。
-
[解決済み] Rで文字列から文字を削除する
-
[解決済み] データフレームを結合(マージ)する方法(内側、外側、左側、右側)
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] リストをデータフレームに変換する
-
[解決済み] 空のdata.frameを作成する
-
[解決済み】データを長尺から長尺にリシェイプする方法
-
[解決済み】data.frameをワイドフォーマットからロングフォーマットにリシェイプする
-
[解決済み】RでCRANミラーを選択する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
RStudio の "plot.new() : figure margins too large" 問題を解決する。
-
R言語のエラーメッセージと関連する解決策
-
Rのexpand.grid()コマンド
-
[解決済み] xkcd風のグラフを作るには?
-
[解決済み] 統計的最頻値の求め方は?
-
[解決済み] ggplotで凡例のタイトルを変更する方法
-
[解決済み】データを長尺から長尺にリシェイプする方法
-
[解決済み】ifelse()でDateオブジェクトがnumericオブジェクトにならないようにする方法
-
[解決済み】エラー:Rで関数が見つかりませんでした。
-
[解決済み】Rスクリプトで警告をグローバルに抑制する方法