1. ホーム
  2. r

[解決済み] dplyrで各グループの最大値を持つ行を選択する方法は?[重複している]。

2022-05-08 15:45:06

質問

<余談
この質問には、すでにここで回答があります :
クローズド 2年前 .

dplyrで各グループの最大値を持つ行を選択したい。

まず、私の質問を示すために、いくつかのランダムなデータを生成します。

set.seed(1)
df <- expand.grid(list(A = 1:5, B = 1:5, C = 1:5))
df$value <- runif(nrow(df))

plyrでは、この行を選択するためにカスタム関数を使用することができました。

library(plyr)
ddply(df, .(A, B), function(x) x[which.max(x$value),])

dplyrでは、このコードを使って最大値を取得していますが、最大値を持つ行(この場合はC列)は取得できていません。

library(dplyr)
df %>% group_by(A, B) %>%
    summarise(max = max(value))

どうすれば実現できるでしょうか?何か提案があれば、ありがとうございます。

sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252   
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C                      
[5] LC_TIME=English_Australia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] dplyr_0.2  plyr_1.8.1

loaded via a namespace (and not attached):
[1] assertthat_0.1.0.99 parallel_3.1.0      Rcpp_0.11.1        
[4] tools_3.1.0        

解決方法は?

これを試してみてください。

result <- df %>% 
             group_by(A, B) %>%
             filter(value == max(value)) %>%
             arrange(A,B,C)

動作しているようです。

identical(
  as.data.frame(result),
  ddply(df, .(A, B), function(x) x[which.max(x$value),])
)
#[1] TRUE

コメントでご指摘の通りです。 slice のように、ここで優先されるかもしれません。 以下の@RoyalITSさんの回答 厳密に1グループにつき1行だけ欲しい場合。この回答は、同じ最大値を持つものが複数ある場合、複数の行を返します。