いつ を使用する必要がdata.frame
あり、いつ を使用する方が良いmatrix
ですか?
どちらもデータを長方形の形式で保持するため、不明確な場合があります。
どのデータ型をいつ使用するかについての一般的な経験則はありますか?
回答の一部はすでに質問に含まれています。列(変数)が異なるタイプ(数値/文字/論理など)であると予想される場合は、データフレームを使用します。行列は、同じタイプのデータ用です。
したがって、matrix/data.frame の選択は、同じタイプのデータがある場合にのみ問題になります。
答えは、data.frame/matrix 内のデータをどうするかによって異なります。他の関数に渡される場合は、これらの関数の引数の予想される型によって選択が決まります。
また:
行列はよりメモリ効率が良い:
m = matrix(1:4, 2, 2)
d = as.data.frame(m)
object.size(m)
# 216 bytes
object.size(d)
# 792 bytes
線形代数タイプの操作を行う予定がある場合は、行列が必要です。
列を名前で (コンパクトな $ 演算子を介して) 頻繁に参照する場合、データ フレームはより便利です。
データフレームは、各列に個別にフォーマットを適用できるため、表形式の情報をレポート (印刷) するのにも適しています。
@Michal が言及していないことは、行列が同等のデータ フレームよりも小さいだけでなく、行列を使用すると、データ フレームを使用するよりもはるかに効率的にコードを作成できることです。これが、内部的に多くの R 関数がデータ フレーム内の行列データを強制する理由の 1 つです。
多くの場合、データ フレームははるかに便利です。データのアトミック チャンクだけが常に横たわっているわけではありません。
文字マトリックスを使用できることに注意してください。R で行列を作成するために数値データが必要なだけではありません。
データフレームを行列に変換する際に、data.matrix()
因子を内部レベルに基づいて数値に変換することによって適切に処理する関数があることに注意してください。as.matrix()
因子ラベルのいずれかが非数値である場合、強制によって文字行列が生成されます。比較:
> head(as.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] "a" "A"
[2,] "b" "B"
[3,] "c" "C"
[4,] "d" "D"
[5,] "e" "E"
[6,] "f" "F"
> head(data.matrix(data.frame(a = factor(letters), B = factor(LETTERS))))
a B
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
多くの場合、数値変数以上のものを使用するため、データ分析タスクにはほぼ常にデータ フレームを使用します。パッケージの関数をコーディングするときは、ほとんどの場合、強制的にマトリックスにしてから、結果をデータ フレームとしてフォーマットします。これは、データ フレームが便利だからです。
@Michal:行列は実際にはメモリ効率が良くありません:
m <- matrix(1:400000, 200000, 2)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 1600776 bytes
...多数の列がない限り:
m <- matrix(1:400000, 2, 200000)
d <- data.frame(m)
object.size(m)
# 1600200 bytes
object.size(d)
# 22400568 bytes
行列は、実際には追加のメソッドを持つベクトルです。一方、data.frame はリストです。違いは、ベクトルとリストにあります。計算効率のために、行列に固執します。必要に応じて data.frame を使用します。