【R】n番目に大きい値をdplyr::summariseする。
問題
グループごとに平均や最大値などを計算するのに便利なdplyr::summariseですが、たとえば2番めに大きい値を計算したい、というときはどうすればいいか?
解決策
自分で簡単な関数を書く。
max2 <- function(x) { u <- unique(x) sort(u, decreasing = TRUE)[2L] }
解説
準備
標準装備mtcarsのデータを例に使います。
# パッケージ library(tidyverse) # dplyr含む # データロード data(mtcars)
ステップ1:最大とか
オートマ/マニュアル別に一番いい燃費はいくらか?
> mtcars %>% group_by(am) %>% summarise(mpg_max = max(mpg), mpg_mean = mean(mpg)) # A tibble: 2 × 3 am mpg_max mpg_mean <dbl> <dbl> <dbl> 1 0 24.4 17.1 2 1 33.9 24.4
最大だとオートマは24.4、マニュアルは33.9、単位はそれぞれガロンあたりのマイルです。
ステップ2:関数を書く
dplyrにはslice_max
(旧top_n
)という関数があるのですが、これは大きい方からn個を引っ張ってくる関数です。
n番目だけ(たとえば2番めだけ)を引っ張ってきたいならいっそ関数書いてしまったほうが早そう。
max2 <- function(x) { u <- unique(x) sort(u, decreasing = TRUE)[2L] }
> mtcars %>% group_by(am) %>% summarise(mpg_max = max(mpg), mpg_mean = mean(mpg), mpg_max2 = max2(mpg)) # A tibble: 2 × 4 am mpg_max mpg_mean mpg_max2 <dbl> <dbl> <dbl> <dbl> 1 0 24.4 17.1 22.8 2 1 33.9 24.4 32.4
2L
の数字を変えれば、n番目の数字に対応します。