データフレームの転置(行と列を反転)
データフレームを転置(行と列を反転)したいときは、関数tを使います。次のように関数tの引数に反転したいデータフレームを指定することで、データフレームの転置ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | > df1 numbers letters logicals dates id:1 1 a TRUE 2022-01-28 id:2 2 b TRUE 2022-01-29 id:3 3 c TRUE 2022-01-30 id:4 4 d TRUE 2022-01-31 id:5 5 e TRUE 2022-02-01 id:6 6 f TRUE 2022-02-02 id:7 7 g TRUE 2022-02-03 id:8 8 h TRUE 2022-02-04 id:9 9 i TRUE 2022-02-05 id:10 10 j FALSE 2022-02-06 > t(df1) id:1 id:2 id:3 id:4 id:5 id:6 id:7 id:8 id:9 id:10 numbers " 1" " 2" " 3" " 4" " 5" " 6" " 7" " 8" " 9" "10" letters "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" logicals "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "TRUE" "FALSE" dates "2022-01-28" "2022-01-29" "2022-01-30" "2022-01-31" "2022-02-01" "2022-02-02" "2022-02-03" "2022-02-04" "2022-02-05" "2022-02-06" |
転置する前のデータフレームの列の型が異なる場合、転置後のデータフレームの型が上のように変わってしまうのに注意する必要があります。
欠測値の処理
データフレームに欠測値NAがあり、NAを除去したいときは、関数na.omitを使います。引数にデータフレームを入れて実行すると、NAが1つでもある行を全て除外することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | > #欠測値 > df5 <- data.frame(A = c(0.8864, -1.6419, -0.9886, -0.2440, 0.1561, 0.1021, -0.2875, -0.2932), + B = c("a", "b", "c", "d", NA, "f", "e", "g"), C = c(NA, 2, 5, NA, 8, 10, 3, 9)) > df5 A B C 1 0.8864 a NA 2 -1.6419 b 2 3 -0.9886 c 5 4 -0.2440 d NA 5 0.1561 <NA> 8 6 0.1021 f 10 7 -0.2875 e 3 8 -0.2932 g 9 > na.omit(df5) A B C 2 -1.6419 b 2 3 -0.9886 c 5 6 0.1021 f 10 7 -0.2875 e 3 8 -0.2932 g 9 |
データフレームの合計・割合・平均・分散
データフレームの行や列ごとの合計や割合、平均、分散を求める例を紹介します。
次の5つのnumeric型の変数をもつデータフレームを例に合計・割合・平均・分散を求めていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | > #合計・割合・平均・分散 > df7 <- data.frame(A = c(290, 300, 270, 320, 330, 350), + B = c(100, 130, 200, 210, 150, 140), + C = c(300, 50, 350, 550, 140, 200), + D = c(200, 220, 180, 190, 200, 210), + E = c(100, 100, 100, 100, 100, 110)) > df7 A B C D E 1 290 100 300 200 100 2 300 130 50 220 100 3 270 200 350 180 100 4 320 210 550 190 100 5 330 150 140 200 100 6 350 140 200 210 110 |
合計
データフレームなどの行列の行と列の合計を求めるには関数rowSumsとcolSumsを使います。各行または各列の合計を計算することが可能です。
1 2 3 4 5 6 7 8 | > rowSum <- rowSums(df7) #行の和 > colSum <- colSums(df7) #列の和 > > rowSum [1] 990 800 1100 1370 920 1010 > colSum A B C D E 1860 930 1590 1200 610 |
割合
次に、データフレームの各行または各列の割合を求める方法を紹介します。関数sumとデータフレームの合計で使った関数rowSumsとcolSumsを用いることで、次のように各行と各列の割合を計算することができます。
1 2 3 4 5 6 7 8 | > rowProp <- rowSums(df7) / sum(df7) #行の割合 > colProp <- colSums(df7) / sum(df7) #列の割合 > > rowProp [1] 0.1599354 0.1292407 0.1777060 0.2213247 0.1486268 0.1631664 > colProp A B C D E 0.30048465 0.15024233 0.25686591 0.19386107 0.09854604 |
平均
各行、各列の平均は関数rowMeansとcolMeansで計算できます。以下、実行例です。
1 2 3 4 5 6 7 8 | > rowMean <- rowMeans(df7) #行の平均 > colMean <- colMeans(df7) #列の平均 > > rowMean [1] 198 160 220 274 184 202 > colMean A B C D E 310.0000 155.0000 265.0000 200.0000 101.6667 |
また、applyを用いることでデータフレームの各行、または各列に関数を適用することできます。次のようにデータフレームにapplyを適用することで平均を求めることもできます。
1 2 3 4 5 | > apply(df7, 1, mean) [1] 198 160 220 274 184 202 > apply(df7, 2, mean) A B C D E 310.0000 155.0000 265.0000 200.0000 101.6667 |
分散
分散を求めるには上のデータフレームの平均の一番下で用いた関数applyを使います。applyの引数functionに関数varを指定することで、各行と各列の分散を求めることが可能です。
1 2 3 4 5 6 7 8 | > rowVar <- apply(df7, 1, var) #行の分散 > colVar <- apply(df7, 2, var) #列の分散 > > rowVar [1] 9520 9950 8950 29930 7930 8570 > colVar A B C D E 840.00000 1790.00000 31150.00000 200.00000 16.66667 |
まとめ
最後に、計算した合計・割合・平均・分散を一つのデータフレームにまとめる例を紹介します。次のように関数rbindとcbindで各行と列の合計や割合などを結合させることで、集計表を作成することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | > summaryTable <- rbind(cbind(df7, rowSum, rowProp, rowMean, rowVar), + cbind(t(colSum), rowSum = sum(df7), rowProp = mean(rowProp), + rowMean = mean(unlist(df7)), rowVar = var(、unlist(df7)))) > > summaryTable A B C D E rowSum rowProp rowMean rowVar 1 290 100 300 200 100 990 0.1599354 198.0000 9520.00 2 300 130 50 220 100 800 0.1292407 160.0000 9950.00 3 270 200 350 180 100 1100 0.1777060 220.0000 8950.00 4 320 210 550 190 100 1370 0.2213247 274.0000 29930.00 5 330 150 140 200 100 920 0.1486268 184.0000 7930.00 6 350 140 200 210 110 1010 0.1631664 202.0000 8570.00 7 1860 930 1590 1200 610 6190 0.1666667 206.3333 11617.13 |
カテゴリカルデータ・ピボットテーブルの作成
カテゴリカルデータのデータセットを解析する際に、ピボットテーブル(クロス集計表)を作成することが多いです。データフレームからピボットテーブルを作成するには、関数xtabsを用います。次のように、引数dataにデータフレームを指定し、引数formulaに~ + 列名1 + 列名2 + . . . + 列名cを指定することで、ピボットテーブルを作ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | > #カテゴリカルデータ > df6 <- data.frame(true = factor(rep(c(TRUE, FALSE), 2, each = 5)), + predict = factor(rep(c(0, 1), 10, each = 1)), + type = factor(rep(c("A", "B", "B", "A"), 5, each = 1))) > df6 true predict type 1 TRUE 0 A 2 TRUE 1 B 3 TRUE 0 B 4 TRUE 1 A 5 TRUE 0 A 6 FALSE 1 B 7 FALSE 0 B 8 FALSE 1 A 9 FALSE 0 A 10 FALSE 1 B 11 TRUE 0 B 12 TRUE 1 A 13 TRUE 0 A 14 TRUE 1 B 15 TRUE 0 B 16 FALSE 1 A 17 FALSE 0 A 18 FALSE 1 B 19 FALSE 0 B 20 FALSE 1 A > xtabs(~ true + predict, df6) #クロス集計表 predict true 0 1 FALSE 4 6 TRUE 6 4 |
また、df6のtrueとpredictとtypeに関する3元集計表は次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | > xtabs(~., df6) #3元集計表 , , type = A predict true 0 1 FALSE 2 3 TRUE 3 2 , , type = B predict true 0 1 FALSE 2 3 TRUE 3 2 |
データフレームのファイルへの保存
最後に、データフレームのファイルへの保存方法について紹介します。
txtファイルへの保存
txtファイルへ保存するには、関数write.tableを用います。write.tableはデフォルトで引数quoteがTRUEであり、character型などの要素にダブルクオーテーション""が付いてしまいます。次のよう引数quote = FALSEを設定することで、""を付けずに保存することが可能です。
1 2 | #txtファイル write.table(df1, "データフレーム操作.txt", quote = FALSE) |
上を実行すると次の画像のtxtファイルが保存されます。
csvファイルへの保存
csvファイルへデータフレームを出力する場合は、専用のwrite.csvを使いましょう。実行すると下の画像のcsvファイルが作業ディレクトリ内に保存されます。
1 2 | #csvファイル write.csv(df1, "データフレーム操作.csv") |
まとめ
データフレームの操作について解説しました。
R言語はベクトルや行列単位での演算に特化しているので、値を参照したり変更したりする際は行や列などのベクトル単位で行ってあげるのがポイントです。ひとつずつデータを変更すると膨大な時間がかかってしまうので、注意が必要です。