R言語でデータフレームで行単位に集計する方法について解説します。このような方法はいくつかありますが、ここでは最も簡単と思われるtidyverseパッケージに含まれているdplyrパッケージのrowwise()とc_across()を使用した方法についてお伝えします。
目次
rowwise()の概要
rowwise()は、行ごとに入力をグループ化する関数です。
rowwise()を使用すると、データフレームを1行ずつ計算できます。これは、ベクトル化された関数が存在しない場合に最も便利です。
rowwise()の使い方
dplyr::rowwise()の使い方は次になります。
rowwise(data, ...)
rowwise()の引数の意味
data
データフレームを指定します。
…
tidy-selectを指定できます。summarise()を呼び出すときに維持される列を指定します。
これは通常、組み合わせによって各行を一意に識別する列の集合です。注意点としては、group_by()とは異なり、ここでは新しい変数を作成することはできませんが、代わりに例えばeverything()を使用して複数の変数を選択できます。
rowwise()の戻り値
rowwise_dfクラスを持つ行単位のデータフレームが返されます。rowwise_dfは行ごとに暗黙的にグループ化されますが、grouped_dfではないことに注意してください。
c_across()の概要
c_across()は、複数の列の値を結合する関数です。
c_across()はrowwise()と連携して行単位の集計を簡単に実行できるように設計されています。
c_across()の使い方
dplyr::c_across()の使い方は次になります。
c_across(cols)
c_across()の引数の意味
cols
tidy-selectが使用できます。列を指定します。
準備
あらかじめ、tidyverseパッケージを読み込んでおきます。
library(tidyverse)
解説のために、anscombeデータセットを使用します。
anscombe |>
head()
x1 x2 x3 x4 y1 y2 y3 y4
1 10 10 10 8 8.04 9.14 7.46 6.58
2 8 8 8 8 6.95 8.14 6.77 5.76
3 13 13 13 8 7.58 8.74 12.74 7.71
4 9 9 9 8 8.81 8.77 7.11 8.84
5 11 11 11 8 8.33 9.26 7.81 8.47
6 14 14 14 8 9.96 8.10 8.84 7.04
行単位で列の和を計算
anscombeデータセットで、行単位でx1とx2、x3、x4の和を計算した列x_sumを追加するには次のようにします。
anscombe |>
rowwise() |>
mutate(x_sum = sum(c_across(starts_with("x")))) |>
head()
# A tibble: 6 × 9
# Rowwise:
x1 x2 x3 x4 y1 y2 y3 y4 x_sum
1 10 10 10 8 8.04 9.14 7.46 6.58 38
2 8 8 8 8 6.95 8.14 6.77 5.76 32
3 13 13 13 8 7.58 8.74 12.7 7.71 47
4 9 9 9 8 8.81 8.77 7.11 8.84 35
5 11 11 11 8 8.33 9.26 7.81 8.47 41
6 14 14 14 8 9.96 8.1 8.84 7.04 50
行単位で列の標準偏差を計算
anscombeデータセットで、行単位でy1とy2、y3、y4の標準偏差を計算した列y_sdを追加するには次のようにします。
anscombe |>
rowwise() |>
mutate(y_sd = sd(c_across(starts_with("y")))) |>
head()
# A tibble: 6 × 9
# Rowwise:
x1 x2 x3 x4 y1 y2 y3 y4 y_sd
1 10 10 10 8 8.04 9.14 7.46 6.58 1.07
2 8 8 8 8 6.95 8.14 6.77 5.76 0.976
3 13 13 13 8 7.58 8.74 12.7 7.71 2.42
4 9 9 9 8 8.81 8.77 7.11 8.84 0.849
5 11 11 11 8 8.33 9.26 7.81 8.47 0.600
6 14 14 14 8 9.96 8.1 8.84 7.04 1.23
R基礎 データフレームで行単位に集計する方法