dplyr::slice_min / dplyr::slice_max 如何处理分组数据的 NA 值?

tre*_*ick 4 r slice na dplyr tidyverse

我想知道是否有人可以解释 dplyr::slice_min() /dplyr::slice_max() 关于 with_ties 参数的行为。对于分组数据,为什么函数在 with_ties = TRUE 时排除 NA 值,但在 with_ties = FALSE 时包含 NA 值?代表如下:

\n
library(tidyverse)\n\ntbl <- tibble(ID = rep(c("a","b","c","d"), each = 3),\n       measure = c(NA, NA, NA, NA, 1, 1, 2, 3, 4, NA, NA, NA))\n\ntbl |> \n  group_by(ID) |> \n  slice_max(measure, with_ties = TRUE)\n\n# A tibble: 3 \xc3\x97 2\n# Groups:   ID [2]\n  ID    measure\n  <chr>   <dbl>\n1 b           1\n2 b           1\n3 c           4\n\ntbl |> \n  group_by(ID) |> \n  slice_max(measure, with_ties = FALSE)\n# A tibble: 4 \xc3\x97 2\n# Groups:   ID [4]\n  ID    measure\n  <chr>   <dbl>\n1 a          NA\n2 b           1\n3 c           4\n4 d          NA\n
Run Code Online (Sandbox Code Playgroud)\n

Maë*_*aël 6

这种不一致似乎最近(2022 年 3 月 23 日)在此 GitHub拉取请求中得到了承认,但更改尚未完成。

当 with_ties 参数设置为 FALSE 时,不再忽略 NA w[h]。这个 PR 解决了这个问题。

默认行为应该是忽略 NA。


在此期间,您仍然可以使用tidyr::drop_na

tbl |> 
  group_by(ID) |> 
  slice_max(measure, with_ties = FALSE) |> 
  drop_na()
Run Code Online (Sandbox Code Playgroud)