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

时间:2017-03-31 16:31:27

标签: 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

&#34; A&#34;的简单选择将是:

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

所以,现在第三个月有两个条目,我想只保留该月的最新条目。我认为这样做很简单:

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

但是我只获取了最后一个条目而删除了其他条目。我错过了什么?输出应为:

  obs       date  num
1   A 2017-01-01 1000
2   A 2017-02-01 2000
4   A 2017-03-02 3500

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

我们可以使用base R

执行此操作
i1 <- with(dat, ave(as.integer(as.Date(date)), obs,
     format(as.Date(date), "%m"), FUN = function(x) x== max(x)) & obs=="A")
dat[i1,]
#  obs       date  num
#1   A 2017-01-01 1000
#3   A 2017-02-01 2000
#7   A 2017-03-02 3500