set.seed(1)
library(tidyverse)
df <- tibble(col1 = c(rep("a", 4), c(rep("b", 4))),
col2 = as.Date(c("2019-01-01", "2019-02-01", "2019-03-01",
"2019-04-01", "2019-01-01", "2019-02-01",
"2019-03-01", "2019-04-01")),
col3 = runif(8))
#> # A tibble: 8 x 3
#> col1 col2 col3
#> <chr> <date> <dbl>
#> 1 a 2019-01-01 0.266
#> 2 a 2019-02-01 0.372
#> 3 a 2019-03-01 0.573
#> 4 a 2019-04-01 0.908
#> 5 b 2019-01-01 0.202
#> 6 b 2019-02-01 0.898
#> 7 b 2019-03-01 0.945
#> 8 b 2019-04-01 0.661
Я хочу отфильтровать самый новый месяц из каждой группы в приведенном выше фрейме данных (отфильтровать 2019-04-01). Я думал, что код dplyr
ниже поможет. Но dplyr::top_n()
, похоже, не работает на моем col2
. Это потому что col2
это класс 'date'? Что за странное предупреждение? И наконец, как только я получу какой-то рабочий код, могу ли я использовать dplyr::top_n(-1, col2)
вместо dplyr::top_n(3, col2)
, чтобы избавиться от наибольшего значения?
df %>% group_by(col1) %>% top_n(col2, 3)
#> # A tibble: 8 x 3
#> # Groups: col1 [2]
#> col1 col2 col3
#> <chr> <date> <dbl>
#> 1 a 2019-01-01 0.629
#> 2 a 2019-02-01 0.0618
#> 3 a 2019-03-01 0.206
#> 4 a 2019-04-01 0.177
#> 5 b 2019-01-01 0.687
#> 6 b 2019-02-01 0.384
#> 7 b 2019-03-01 0.770
#> 8 b 2019-04-01 0.498
#> Warning messages:
#> 1: In if (n > 0) { :
#> the condition has length > 1 and only the first element will be used
#> 2: In if (n > 0) { :
#> the condition has length > 1 and only the first element will be used