如果我有一个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感到困惑。
答案 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