Подстройка dplyr по группе, исключая NA - PullRequest
0 голосов
/ 02 октября 2018

Если у меня есть 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 s есть NA?

# 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 голосов
/ 02 октября 2018

Причина в поднаборах.Таким образом, после подмножества возвращается индекс 1 для «shape1» «b», который является строкой, в которой присутствует элемент 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
...