こんにちは。ほしのはやしです。
Rで複数の列に対して「平均」や「標準偏差」などを一括で計算したいとき、tidyverseパッケージに入っているacross()がとても便利です。
この記事では、初心者でも使いやすいacross()の基本と応用を、具体的なコード付きでやさしく解説します。
group_byとsummariseの使い方が基本になりますので、下記ページも参考にしてください!

基本の使い方:across()で平均をまとめて出す
まずは以下のコードで練習用のテーブルを作成します!
library(tidyverse)
# 架空の売上データを作成
set.seed(123)
sales_data <- tibble(
store = rep(c("A", "B", "C"), each = 5),
sales = sample(100:200, 15),
profit = sample(20:50, 15),
customers = sample(50:100, 15)
)

以下のコードでグループ毎に複数の列で統計を算出します。
sales_data %>%
group_by(store) %>%
summarise(
across(c(sales, profit, customers), mean, .names = "{.col}_mean")
)

acrossの中の説明について、もう少し噛み砕いてテーブルにします。
パーツ | 意味 |
---|---|
c(sales, profit, customers) | 「sales」「profit」「customers」の3つの列を対象にする |
mean | それぞれの列に対して平均(mean)を計算する |
.names = "{.col}_mean" | 出力列の名前を sales_mean、profit_mean のようにする |
基本的には以下のように考えればOKです!
across(解析したい列名, データの計算方法, 計算結果を入れる新しい列名)
応用:標準偏差、標準誤差、件数をまとめて出す
続いて、先ほどのデータを用いて統計に必要な平均値などの数値をまとめてグループ毎に出す方法についてご紹介します。
library(tidyverse)
sales_data %>%
group_by(store) %>%
summarise(
across(c(sales, profit, customers), # 解析する列を選択
list(
mean = mean,
sd = sd,
se = ~sd(.) / sqrt(length(.)),
ci_low = ~mean(.) - 1.96 * sd(.) / sqrt(length(.)),
ci_high = ~mean(.) + 1.96 * sd(.) / sqrt(length(.))
),
.names = "{.col}_{.fn}"),
count = n()
)

コードを解説します。
同じように%>%をつかって、sales_dataテーブルから、store列の内容に従ってグループ分け(group_by)します。
summariseで、必要な項目を計算して表示します。
acrossの内容では、まずc(sales, profit, customers)で計算する列名を選択します。
その後計算するための関数をlistでまとめて入力します(ここはコピペでOK!)
.names = “{.col}_{.fn}”)で、計算結果を入れる列名を自動で、
計算元の列名_計算で使った関数
と表記するように指示しています。

複数の列を一気に要約する方法がわかったね!



複数に関数(計算)を適応するときはacrossが便利やでな!
まとめ
グループ化して複数の列を一気に要約統計する方法についてご説明しました!
特にtidyverseはテーブル処理で必須のパッケージですので、必ずインストールするのをおすすめします!!
皆様のお役に立てたなら幸いです。
コメント