Dplyr:在一系列的日期过滤器最后一个条目(Dplyr: filter last entry fo

2019-09-28 09:24发布

我想过滤的时间序列,其中有不止一个给定的每月只发生在最后一天的条目。

作为像这样的表的一个示例:

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

对于“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

所以,现在有第三个月两个项目,我想只保留当月最新的条目。 我认为这将是这样做的我做了一个简单的事情:

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

Answer 1:

您需要按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


Answer 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


文章来源: Dplyr: filter last entry for date in a series
标签: r dplyr