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

4

我想知道有没有人能够解释 dplyr::slice_min() /dplyr::slice_max() 函数在 with_ties 参数下的行为。对于分组数据,当 with_ties = TRUE 时,为什么该函数会排除 NA 值,而当 with_ties = FALSE 时,则包括 NA 值?以下是重现代码:

library(tidyverse)

tbl <- tibble(ID = rep(c("a","b","c","d"), each = 3),
       measure = c(NA, NA, NA, NA, 1, 1, 2, 3, 4, NA, NA, NA))

tbl |> 
  group_by(ID) |> 
  slice_max(measure, with_ties = TRUE)

# A tibble: 3 × 2
# Groups:   ID [2]
  ID    measure
  <chr>   <dbl>
1 b           1
2 b           1
3 c           4

tbl |> 
  group_by(ID) |> 
  slice_max(measure, with_ties = FALSE)
# A tibble: 4 × 2
# Groups:   ID [4]
  ID    measure
  <chr>   <dbl>
1 a          NA
2 b           1
3 c           4
4 d          NA

2
如果您使用 with_ties = TRUE 进行调用,它会调用多个其他函数,例如 smaller_ranks 等。如果是 FALSE,则从顺序中创建索引。idx <- function(x, n) head(order(x, decreasing = TRUE), size(n)) - akrun
1个回答

6

最近(2022年3月23日)在这个GitHub的拉取请求中,似乎已经承认了这种不一致性,但是尚未进行更改。

当with_ties参数设置为FALSE时,不再忽略NAs。本PR修复了此问题。

默认行为应该是忽略NAs。


与此同时,您仍然可以使用tidyr::drop_na

tbl |> 
  group_by(ID) |> 
  slice_max(measure, with_ties = FALSE) |> 
  drop_na()

谢谢!在我的情况下,我想保留NA值,所以我想确保使用with_ties = FALSE是可以的,并且不会在将来出现问题。 - trevin_flick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接