R言語のtidyverseパッケージを用いて、group_by関数によりグループ分けした結果に対してsummary関数を適用する方法についてお伝えいたします。

ここでお伝えする方法は、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 %>% group_nest(Species) %>% mutate(s = map(data, ~ summary(.))) %>% 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関数を用いた方法を用いるのが良いと思います。

関連する記事

  • DockerでMySQL8.0を使う方法DockerでMySQL8.0を使う方法 DockerでMySQL8.0を使用できるまでの手順をお伝えします。 ここでは、docker-composeとDocker公式のMySQL8.0イメージを用います。 環境 ホストOS ホストOSはUbuntu 20.04を用いております。 $ cat /etc/lsb-release […]
  • 平均的に分類する方法の考察(3)平均的に分類する方法の考察(3) 前回は、定量データをスコア順に並び替えたのち、この順番でグループに割り振っていく方法を見た。今回は、定量データをスコア順に並び替えるところは同じだが、割り振り方を変更することにより、より平均的に分類できないかを見ていく。 前回と同じく、100人の学生を3つのクラスA、B、Cに分ける方法を考えてみる。 まず、学生をスコア順にA、B、Cに一人ずつ割り振る。 次に […]
  • さくらVPSのUbuntuでWordPressをHTTPからHTTPSへ移行する手順さくらVPSのUbuntuでWordPressをHTTPからHTTPSへ移行する手順 当サイトをhttpsに移行した手順をお伝えいたします。 当サイトはさくらVPS上のUbuntu 14.04LTSでWordPressを構築して運用しております。そこで、SSLサーバ証明書はさくらインターネットのサービスであるラピッドSSLを使用することにしました。このサービスを選んだ理由は次になります。 価格が安い […]
  • DockerでMariaDB10.5を使う方法DockerでMariaDB10.5を使う方法 DockerでMariaDB 10.5を使用できるまでの手順をお伝えします。 ここでは、docker-composeとDocker公式のMariaDB 10.5イメージを用います。 環境 ホストOS ホストOSはUbuntu 20.04を用いております。 $ cat /etc/lsb-release […]
  • Wikipediaのデータファイルをプレーンテキストに変換するWikipediaのデータファイルをプレーンテキストに変換する Wikipediaのデータファイルをプレーンテキストに変換する方法を備忘記録として記しておく。 Wikipedia日本語版のデータファイルは以下のサイトからダウンロードできる。 ウィキペディア日本語版 Wikipediaのデータファイルをプレーンテキストに変換するPythonプログラム「WikiExtractor」を以下のサイトからダウンロードする。 […]
R group_byにsummaryを適用する方法