R データフレームと行列の違い

UB3/informatics/r/dataframe_matrix

このページの最終更新日: 2023/08/24


  1. R のデータフレームと行列の違い
  2. データフレームでは平均値が計算できない
  3. データフレームではヒートマップが作れない
  4. データフレームの行と列を t() 関数で交換すると行列になる

広告

R のデータフレームと行列の違い

詳細は dataframe のメインページ にまとめているが、R のデータフレームは 各行、各列が必ずラベルをもち、ラベルによる操作が可能である点が行列 matrix と異なる (2)。

このページでは、組み込みデータセット cars を使ってこの意味をよく考えてみる。cars は以下のような speed, dist の 50 行 2 列データである。数値だけなので、このページの目的に都合がいい。

Rの組み込みデータセット cars

まずは、cars がデータフレームであることを確認し、行列に変換した cars_matrix と、データフレームの cars_dataframe を準備する。

is.matrix(cars)
# 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 は全く同じに見える。

cars dataframe cars matrix

ただし、print関数で表示すると、データフレームには行番号があるのに対し、行列 matrix にはそれがなく、表示の際に便宜的な番号が割り振られる。

> cars_matrix
speed dist
[1,]  4  2
[2,]  4  10
[3,]  7  4
[4,]  7  22
[5,]  8  16

> cars_dataframe
speed dist
1  4  2
2  4  10
3  7  4
4  7  22
5  8  16

また、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 が返ってくる。

Warning message:
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 をインプットにできない。

Rで作成したヒートマップ

例えば、デフォルトの heatmap 関数を上の cars の例に適用してみると、次のようになる。

heatmap(cars_dataframe) #エラーになる
heatmap(cars_matrix) #これはOK
heatmap(as.matrix(cars_dataframe)) #これもOK

うまくいった場合、以下のようなヒートマップが出力されるはずである。

cars dataframe

データフレームの行と列を t() 関数で交換すると行列になる

cars_dataframe = cars
cars_dataframe2 = t(cars_dataframe)
cars_dataframe3 = as.data.frame(t(cars_dataframe))

cars heatmap

以上のように、ただ t() 関数で変換した cars_dataframe2 は、cars_matrix と同じように表示される。

データフレームの形を維持するためには、cars_dataframe3 のように as.data.frame 関数を使わなければならない。


広告

References

  1. R : matrixとdata.frameの違い. Link: Last access 2022/05/21.
  2. R-Tips 39. データフレーム事始. Link.

コメント欄

サーバー移転のため、コメント欄は一時閉鎖中です。サイドバーから「管理人への質問」へどうぞ。