我想过滤一个时间序列中的最后一个日期条目,以便在给定月份的每个匹配项中有多个日期条目。
作为这样的表中的一个例子:
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
答案 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