R データフレームと行列の違い
UB3/informatics/r/dataframe_matrix
このページの最終更新日: 2024/09/30広告
R のデータフレームと行列の違い
詳細は dataframe のメインページ にまとめているが、R のデータフレームは
このページでは、組み込みデータセット cars を使ってこの意味をよく考えてみる。cars は以下のような speed, dist の 50 行 2 列データである。数値だけなので、このページの目的に都合がいい。
まずは、cars がデータフレームであることを確認し、行列に変換した cars_matrix と、データフレームの cars_dataframe を準備する。
# FALSE が返ってくるはず。つまり cars は matrix ではない。
is.data.frame(cars)
#こちらはTRUE。つまり cars はデータフレームである。
cars_matrix = as.matrix(cars)
# cars を matrix として保存する。
is.matrix(cars_matrix)
is.data.frame(cars_matrix)
# それぞれ TRUE および FALSE になるはず。
cars_dataframe = cars
# 名前を合わせるため、cars_dataframe も作っておく。
オブジェクトのプレビューで確認してみると、cars_dataframe と cars_matrix は全く同じに見える。
ただし、print関数で表示すると、データフレームには行番号があるのに対し、行列 matrix にはそれがなく、表示の際に便宜的な番号が割り振られる。
> cars_matrix |
> cars_dataframe |
また、RStudio ではデフォルトで右上に Data という欄がある。データフレームなら、ここに 100 obs. of 10 variables のように表示される。これは 100 行 10 列のデータということで、行が observation になるという整然データのルールに従った表示である。
matrix の場合は、ここに num [1:100, 1:10] のように表示される。これが 100 行 10 列に相当する。
データフレームでは平均値が計算できない
ところが、ここで 文献 1 にあるように平均をとってみると、両者が違うことがわかる。つまり、mean(cars_matrix) では 29.19 という値 (全ての数字の平均値) が返ってくるのに対し、mean(cars_dataframe) では以下のエラーが出て、NA が返ってくる。
In mean.default(cars_dataframe) :
argument is not numeric or logical: returning NA
このエラーは、日本語では「引数は数値でも論理値でもありません。NA 値を返します」となるようだ (1)。
つまり、単なる数字の集合である行列 matrix では、全ての平均を取ることに意味があるのに対し、データフレームでは列ごとに意味があるので、複数の列をまたいで平均を計算することはできない、と解釈することができる (1)。
ただし、平均ではなく合計をとる sum(cars_matrix) と sum(cars_dataframe) はどちらも 2919 と計算されるので、この解釈にも疑問が残る。これは、単に「mean 関数はデータフレームをインプットにできない」と解釈する方が良さそうだ。
データフレームではヒートマップが作れない
下にあるような、値を色の違いで表した図をヒートマップ heatmap という (図は Public domain)。R にはヒートマップを作る関数はたくさんある (参考: R によるヒートマップ作成) が、多くは data frame をインプットにできない。
例えば、デフォルトの heatmap 関数を上の cars の例に適用してみると、次のようになる。
heatmap(cars_matrix) #これはOK
heatmap(as.matrix(cars_dataframe)) #これもOK
うまくいった場合、以下のようなヒートマップが出力されるはずである。
データフレームの行と列を t() 関数で交換すると行列になる
cars_dataframe2 = t(cars_dataframe)
cars_dataframe3 = as.data.frame(t(cars_dataframe))
以上のように、ただ t() 関数で変換した cars_dataframe2 は、cars_matrix と同じように表示される。
データフレームの形を維持するためには、cars_dataframe3 のように as.data.frame 関数を使わなければならない。
広告
References
コメント欄
サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。