[解決済み] dplyrで複数列のサマリーを作成する?重複
2022-04-23 12:51:21
質問
dplyr-syntaxで少し苦労しています。私は、異なる変数と1つのグループ化変数を持つデータフレームを持っています。今、私はRでdplyrを使用して、各グループ内の各列の平均を計算したいです。
df <- data.frame(
a = sample(1:5, n, replace = TRUE),
b = sample(1:5, n, replace = TRUE),
c = sample(1:5, n, replace = TRUE),
d = sample(1:5, n, replace = TRUE),
grp = sample(1:3, n, replace = TRUE)
)
df %>% group_by(grp) %>% summarise(mean(a))
これは、"grp"で示される各グループの列"a"の平均を与えてくれます。
質問ですが、各グループ内の各列の平均値を一度に求めることは可能でしょうか?それとも、次のことを繰り返さなければならないのでしょうか?
df %>% group_by(grp) %>% summarise(mean(a))
を各カラムに適用できますか?
私が望むのは、次のようなものです。
df %>% group_by(grp) %>% summarise(mean(a:d)) # "mean(a:d)" does not work
解決方法は?
で
dplyr
(>=1.00) を使用することができます。
across(everything()
で
summarise
を使うと、すべての変数に関数が適用されます。
library(dplyr)
df %>% group_by(grp) %>% summarise(across(everything(), list(mean)))
#> # A tibble: 3 x 5
#> grp a b c d
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 3.08 2.98 2.98 2.91
#> 2 2 3.03 3.04 2.97 2.87
#> 3 3 2.85 2.95 2.95 3.06
あるいは
purrrlyr
パッケージは同じ機能を提供します。
library(purrrlyr)
df %>% slice_rows("grp") %>% dmap(mean)
#> # A tibble: 3 x 5
#> grp a b c d
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 1 3.08 2.98 2.98 2.91
#> 2 2 3.03 3.04 2.97 2.87
#> 3 3 2.85 2.95 2.95 3.06
また
data.table
(使用
keyby
を使用すると、ソートグループを並べ替えることができます)。
library(data.table)
setDT(df)[, lapply(.SD, mean), keyby = grp]
#> grp a b c d
#> 1: 1 3.079412 2.979412 2.979412 2.914706
#> 2: 2 3.029126 3.038835 2.967638 2.873786
#> 3: 3 2.854701 2.948718 2.951567 3.062678
性能比較をしてみましょう。
library(dplyr)
library(purrrlyr)
library(data.table)
library(bench)
set.seed(123)
n <- 10000
df <- data.frame(
a = sample(1:5, n, replace = TRUE),
b = sample(1:5, n, replace = TRUE),
c = sample(1:5, n, replace = TRUE),
d = sample(1:5, n, replace = TRUE),
grp = sample(1:3, n, replace = TRUE)
)
dt <- setDT(df)
mark(
dplyr = df %>% group_by(grp) %>% summarise(across(everything(), list(mean))),
purrrlyr = df %>% slice_rows("grp") %>% dmap(mean),
data.table = dt[, lapply(.SD, mean), keyby = grp],
check = FALSE
)
#> # A tibble: 3 x 6
#> expression min median `itr/sec` mem_alloc `gc/sec`
#> <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl>
#> 1 dplyr 2.81ms 2.85ms 328. NA 17.3
#> 2 purrrlyr 7.96ms 8.04ms 123. NA 24.5
#> 3 data.table 596.33µs 707.91µs 1409. NA 10.3
関連
-
R言語のエラーメッセージと関連する解決策
-
R plot.new() のエラー : 図形の余白が大きすぎる
-
[解決済み] Rの%*%の意味 [重複]について
-
[解決済み] 文字列ベクトルを代入して、列名を持つ空のデータフレームを作成する?重複
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] 複数の列でグループ化する
-
[解決済み] Rの代入演算子"="と"<-"の違いは何ですか?
-
[解決済み] データフレーム内の列を名前でドロップする方法
-
[解決済み] Rでオブジェクト(変数)が定義されているかどうかを確認するには?
-
[解決済み】data.table vs dplyr:一方がうまくできない、またはうまくできないことを行うことができますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
R: 環境と変数のスコープ問題
-
R - よくあるエラーとその原因 - 注意事項
-
[解決済み] lm.fit(x,y,offset = offset, singular.ok,...) 0 非NAケースでboxcox式で計算するとエラーになる。
-
[解決済み] Rでデータフレームに行を追加する方法は?
-
[解決済み] 不足しているパッケージをチェックし、インストールするためのエレガントな方法?
-
[解決済み] data.frameの1つの列の名前を変更する方法は?
-
[解決済み】自作関数を書くときにRの省略機能を使うには?
-
[解決済み】set.seed関数を使用する理由
-
[解決済み] セッションが作成されません。このバージョンのChromeDriverはChromeバージョンにしか対応していません ChromeDriver ChromeでSeleniumを使用した場合の74エラー
-
[解決済み] 複数の変数をグループごとに集計/要約する(例:合計、平均)。