如何用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)