データ分析メモと北欧生活

旧Untitled Note. データ分析、計量経済・統計とR、水産管理、英語勉強、海外生活などについて備忘録や自分の勉強のOutputの場所として

MENU

【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番目の数字に対応します。