dplyr按组的子设置,不包括NA

时间:2018-10-02 17:56:04

标签: r dplyr tidyverse

如果我有一个data.frame:dat = data.frame(shape1 = c('a', 'a', 'b', 'b'), date = c(today() - 0:3), value = c(1, 2, NA, 16)) 然后运行:

dat %>% dplyr::group_by(shape1) %>% dplyr::slice(base::which.max(date[!is.na(value)]))

为什么NA中有value个?

# A tibble: 2 x 3
# Groups: shape1 [2]
  shape1 date       value
  <chr>  <date>     <dbl>
1 a      2018-10-02  1.00
2 b      2018-09-30  NA  

[!is.na(value)]不应该排除它们吗? 这将返回我正在寻找的内容

dat %>% dplyr::group_by(shape1) %>% dplyr::filter(!is.na(value)) %>% dplyr::slice(base::which.max(date))
# A tibble: 2 x 3
# Groups: shape1 [2]
  shape1 date       value
  <chr>  <date>     <dbl>
1 a      2018-10-02  1.00
2 b      2018-09-29  16.0 

但是,我对为什么第一个返回NA感到困惑。

1 个答案:

答案 0 :(得分:0)

原因是由于子设置。因此,在子集之后,对于“ shape1”“ b”,返回的索引为1,恰好是原始数据中存在NA元素的行。最好先filter。但是,可以将==max值一起使用,并选择第一个元素(如果是平局)

dat %>%
    group_by(shape1) %>% 
    slice(which(date == max(date[!is.na(value)]))[1])
# A tibble: 2 x 3
# Groups:   shape1 [2]
#  shape1 date       value
#  <fct>  <date>     <dbl>
#1 a      2018-10-02     1
#2 b      2018-09-29    16