【问题标题】:dplyr sub-setting by group, excluding NAs按组划分的 dplyr 子设置,不包括 NA
【发布时间】:2018-10-02 17:56:03
【问题描述】:

如果我有一个 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)]))

为什么value中有NAs?

# 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 感到困惑。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    原因是由于子集。因此,在子集之后,“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
    

    【讨论】:

    • 这是操作顺序问题吗? dplyr 在检查 NA 值之前是否按 date 切片?
    • @R.M. which.max 返回子集元素的索引而不是原始数据索引,但是当它进入slice时,索引1表示组的第1行
    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2023-03-26
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多