Dplyr:过滤系列中日期的最后一个条目

Mon*_*uiz 1 r dplyr

我想针对给定月份有多个事件的每次出现只过滤时间序列中的最后一个日期条目。

例如,在这样的表中:

obs <- c("A", "B", "A", "B", "A", "B", "A", "B")
date <- c("2017-01-01", "2017-01-01", "2017-02-01", "2017-02-01", "2017-03-01", "2017-03-01", "2017-03-02","2017-03-02")
num <- c(1000, 1800, 2000, 2900, 3000, 3400, 3500, 3400)
dat <- data.frame(obs, date, num)

    obs       date  num
1   A 2017-01-01 1000
2   B 2017-01-01 1800
3   A 2017-02-01 2000
4   B 2017-02-01 2900
5   A 2017-03-01 3000
6   B 2017-03-01 3400
7   A 2017-03-02 3500
8   B 2017-03-02 3400
Run Code Online (Sandbox Code Playgroud)

对“ A”的简单选择是:

x <- dat %>%
  filter(obs=="A") %>%
  select(obs, date, num) %>%
  mutate(date = ymd(date))

  obs       date  num
1   A 2017-01-01 1000
2   A 2017-02-01 2000
3   A 2017-03-01 3000
4   A 2017-03-02 3500
Run Code Online (Sandbox Code Playgroud)

因此,现在第三个月有两个条目,我只想保留该月的最新条目。我认为这样做是一件很简单的事情:

x <- dat %>%
  filter(obs=="A") %>%
  select(obs, date, num) %>%
  mutate(date = ymd(date)) %>%
  arrange(date) %>%
  slice(which.max(date))
Run Code Online (Sandbox Code Playgroud)

但是我只得到最后一个条目,而删除了其他条目。我想念什么?输出应为:

  obs       date  num
1   A 2017-01-01 1000
2   A 2017-02-01 2000
4   A 2017-03-02 3500
Run Code Online (Sandbox Code Playgroud)

mto*_*oto 5

您需要分组month(date),然后过滤最后的日期:

dat %>% filter(obs=="A") %>%
        mutate(date = ymd(date)) %>%
        group_by(obs, m = month(date)) %>% 
        filter(date == max(date))
#     obs       date   num     m
#1      A 2017-01-01  1000     1
#2      A 2017-02-01  2000     2
#3      A 2017-03-02  3500     3
Run Code Online (Sandbox Code Playgroud)