如何用dplyrselect每个组中具有最大值的行?

我想用dplyr在每个组中select一个最大值的行。

首先,我生成一些随机数据来显示我的问题

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

在plyr中,我可以使用自定义函数来select这一行。

 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)) 

我怎么能做到这一点? 感谢您的任何build议。

 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 

正如@docendo在评论中指出的那样,如果您严格只需要每组1行,就可以根据@RoyalITS的答案在下面selectslice 。 如果有多个相同的最大值,这个答案将返回多行。

你可以使用top_n

 df %>% group_by(A, B) %>% top_n(n=1) 

这将排在最后一列( value ),并返回最上面的n=1行。

目前,你不能改变这个默认值而不会导致错误(参见https://github.com/hadley/dplyr/issues/426

 df %>% group_by(A,B) %>% slice(which.max(value)) 

这个更详细的解决scheme可以更好地控制在最大值重复的情况下会发生什么(在这个例子中,它会随机选取一个对应的行)

 library(dplyr) df %>% group_by(A, B) %>% mutate(the_rank = rank(-value, ties.method = "random")) %>% filter(the_rank == 1) %>% select(-the_rank) 
Interesting Posts