ここでお伝えする方法は、tidyverseパッケージを用いる方法となりますので、tidyverseパッケージを読み込んでおきます。
library(tidyverse)
サンプルデータ
サンプルデータは、Rに標準で搭載されているirisを用いることにします。
irisの構造は次になります。
iris %>% str()
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
group_byにsummaryを適用するコード
group_by関数によりグループ分けした結果に対してsummary関数を適用するコードは以下になります。
iris %>%
(con) group_nest(Species) %>%
(con) mutate(s = map(data, ~ summary(.))) %>%
(con) pull(s, Species)
$setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.300 Min. :1.000 Min. :0.100
1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:0.200
Median :5.000 Median :3.400 Median :1.500 Median :0.200
Mean :5.006 Mean :3.428 Mean :1.462 Mean :0.246
3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:0.300
Max. :5.800 Max. :4.400 Max. :1.900 Max. :0.600
$versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.900 Min. :2.000 Min. :3.00 Min. :1.000
1st Qu.:5.600 1st Qu.:2.525 1st Qu.:4.00 1st Qu.:1.200
Median :5.900 Median :2.800 Median :4.35 Median :1.300
Mean :5.936 Mean :2.770 Mean :4.26 Mean :1.326
3rd Qu.:6.300 3rd Qu.:3.000 3rd Qu.:4.60 3rd Qu.:1.500
Max. :7.000 Max. :3.400 Max. :5.10 Max. :1.800
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.900 Min. :2.200 Min. :4.500 Min. :1.400
1st Qu.:6.225 1st Qu.:2.800 1st Qu.:5.100 1st Qu.:1.800
Median :6.500 Median :3.000 Median :5.550 Median :2.000
Mean :6.588 Mean :2.974 Mean :5.552 Mean :2.026
3rd Qu.:6.900 3rd Qu.:3.175 3rd Qu.:5.875 3rd Qu.:2.300
Max. :7.900 Max. :3.800 Max. :6.900 Max. :2.500
コードを簡単に説明します。
group_nest関数は、与えれた引数の列の値ごとに、与えられた引数の列以外をリストにまとめます。
デフォルトでは、data列としてまとめられます。
mutate関数により新たにsという列を追加します。
sという列は、group_nest関数により作成されたdata列に対してsummary関数を適用し、その結果を保持します。
pull関数によりs列を抽出し、このときの名前を与えています。
ここでは、Species列の各値になります。
まとめ
group_by関数によりグループ分けした結果に対してsummary関数を適用する方法についてお伝えしました。
今回お伝えした方法の利点は、手早く確認できる点です。
普通に考えられる方法としては、summarise関数内でmin関数やmax関数などを記載する方法ですが、これではキーのタイプ量が増えてしまいますし、numeric型とfactor型が列にある場合は同一の処理で記載することは困難です。
その点、今回の方法は、キーのタイプ量がそれほど多くなく、列の型を意識することもないので、かなりお手軽に確認できると思います。
逆に、今回お伝えした方法の欠点は、summary関数の結果を再利用できない点です。
今回お伝えした方法は、表示のみです。
そのため、summary関数の結果をさらにデータフレームとして用いることはやや困難です。
summary関数の結果を再利用する必要があるときには、素直にsummarise関数を用いた方法を用いるのが良いと思います。