俺的{dplyr1.0.0}メモ~summrise()編~
最近は、fgoでキャメロットまで行きました。ガヴェインを令呪1画使って倒しましたとさ(ぎゃてぇ)
今更、{dplyr1.0.0}
をキャッチアップしていこうのコーナー
今回はsummarise()
、便利な集計関数ですね。
以下を参考にしました
dplyr 1.0.0: new
summarise()
featuresTidyvese blogの記事
Summarise each group to fewer rows
summarise()
の公式ドキュメントdplyr 1.0.0 を使ってみる: summarise()
日本語の記事 by 世界のyutaniさん
{dplyr1.0.0}
のsummarise()
で追加された俺的に特徴的な機能はこちら
ungroup()
がいらなくなった- 複数の値やデータフレームを関数を使えるようになった
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は便利だけど、どのように使うのがベストかは一行の余地あるよね」的なことを書いているので、この辺りは変化する可能性があると思います。