to be continued...

Rや心理統計学の備忘録的な

There are three kinds of lies: lies, damned lies, and statistics.

- 嘘には三種類ある。嘘、大嘘、そして統計だ -
Benjamn Disraeli(19世紀のイギリス首相)

俺的{dplyr1.0.0}メモ~summrise()編~

最近は、fgoキャメロットまで行きました。ガヴェインを令呪1画使って倒しましたとさ(ぎゃてぇ)

今更、{dplyr1.0.0}をキャッチアップしていこうのコーナー

今回はsummarise()、便利な集計関数ですね。

以下を参考にしました

{dplyr1.0.0}summarise()で追加された俺的に特徴的な機能はこちら

  1. ungroup()がいらなくなった
  2. 複数の値やデータフレームを関数を使えるようになった
  3. summarise()を使ってフォルダ内のデータを一気に読み込めるようになった

3は2の機能を使ったものなので、実質1,2ですかね

準備

今回はdplyr::stormsデータを使います。NOAA大西洋ハリケーンデータベースのベストトラックデータのサブセットです。このデータには、198個の熱帯性暴風雨の位置と属性が含まれており、暴風雨が観測されてから6時間ごとに測定されています。

#初めて、またはバージョンが古いときはインストールしなおしましょう
#install.packages("dplyr")
library(dplyr,warn.conflicts = F)
 
storms
# A tibble: 10,010 x 13
   name   year month   day  hour   lat  long status              category  wind pressure ts_diameter hu_diameter
   <chr> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <chr>               <ord>    <int>    <int>       <dbl>       <dbl>
 1 Amy    1975     6    27     0  27.5 -79   tropical depression -1          25     1013          NA          NA
 2 Amy    1975     6    27     6  28.5 -79   tropical depression -1          25     1013          NA          NA
 3 Amy    1975     6    27    12  29.5 -79   tropical depression -1          25     1013          NA          NA
 4 Amy    1975     6    27    18  30.5 -79   tropical depression -1          25     1013          NA          NA
 5 Amy    1975     6    28     0  31.5 -78.8 tropical depression -1          25     1012          NA          NA
 6 Amy    1975     6    28     6  32.4 -78.7 tropical depression -1          25     1012          NA          NA
 7 Amy    1975     6    28    12  33.3 -78   tropical depression -1          25     1011          NA          NA
 8 Amy    1975     6    28    18  34   -77   tropical depression -1          30     1006          NA          NA
 9 Amy    1975     6    29     0  34.4 -75.8 tropical storm      0           35     1004          NA          NA
10 Amy    1975     6    29     6  34   -74.8 tropical storm      0           40     1002          NA          NA
# ... with 10,000 more rows

ungroup()がいらなくなった

引数に.groupsが追加されました

  • drop_last: group_by()の最後の水準(変数)のグループ化を解除

    バージョン 1.0.0以前のデフォルト機能

    例:group_by(A,B)としたときに、Bのgroup化を解除する

  • drop: 全変数のgroup化の解除

    ungroup()と同じ

  • keep: group化の維持

  • rowwise: 各行をgruop化するのかな?

.groups = "drop"と指定することでungroup()する必要がなくなりました!


複数の値やデータフレームを関数を使えるようになった

summarise()range(),quantile()といった関数が使えるようになりました

> storms %>% 
+   group_by(name) %>% 
+   summarise(rng = range(wind))
`summarise()` regrouping output by 'name' (override with `.groups` argument)
# A tibble: 396 x 2
# Groups:   name [198]
   name       rng
   <chr>    <int>
 1 AL011993    25
 2 AL011993    30
 3 AL012000    25
 4 AL012000    25
 5 AL021992    25
 6 AL021992    30
 7 AL021994    15
 8 AL021994    30
 9 AL021999    25
10 AL021999    30
# ... with 386 more rows

quantile()も

> storms %>% 
+   group_by(name) %>% 
+   summarise(wind = quantile(wind, c(0.25, 0.5, 0.75)),
+           q = c(0.25, 0.5, 0.75))         
`summarise()` regrouping output by 'name' (override with `.groups` argument)
# A tibble: 594 x 3
# Groups:   name [198]
   name      wind     q
   <chr>    <dbl> <dbl>
 1 AL011993  25    0.25
 2 AL011993  27.5  0.5 
 3 AL011993  30    0.75
 4 AL012000  25    0.25
 5 AL012000  25    0.5 
 6 AL012000  25    0.75
 7 AL021992  30    0.25
 8 AL021992  30    0.5 
 9 AL021992  30    0.75
10 AL021994  21.2  0.25
# ... with 584 more rows

summarise()の返り値としてData-frame columnが可能になったからでしょうか。nest()unnest()をいい感じやってくれるような感じのイメージです。あまり、使うことはないかもですができることは広がりますね。


summarise()を使ってフォルダ内のデータを一気に読み込めるようになった

Data-frame columnをとれるようになったので、ファイルのパスを取得できればデータを{tidyverse}を使って一気に読み取れるようになりました。個人的にはこれがかなり便利かもと思っています。フォルダ内のデータを一気に読み込む方法はこれまでもいろんな方法が提案されていますが、これが一番速く読み取れるんじゃないでしょうか。どちらにせよ以下の様に三行で読み込めるのでいいと思います。

tibble(path = dir(pattern = "\\.csv$")) %>% 
  #rowwise()は各行をgroup化する
  rowwise(path) %>%
  #path列にある、各ファイルを読み込む
  summarise(read_csv(path))

summarise()単体で覚えておきたい機能はこんな感じでしょうか。これ以外にもacross()という関数を使えばさらに便利に使えるといわれたりしてますが。それは、また別の記事で言及しようかなと思います。今回はここまでー

Summarise each group to fewer rowsでも、「Data-frame columnは便利だけど、どのように使うのがベストかは一行の余地あるよね」的なことを書いているので、この辺りは変化する可能性があると思います。

to be continued...