我有一个结构为:
的数据框架id status submissions date
1 offline 1 2017
1 online 2 2018
1 online 3 2006
2 offline 1 2006
2 online 4 2018
2 online 2 2002
2 online 5 2004
我的问题是,对于每个ID,提交较高的行应该的日期> =前一个。我如何过滤数据框以拥有:
id status submissions date
1 offline 1 2017
1 online 2 2018
2 offline 1 2006
2 online 4 2018
ive尝试使用dplyr group_by()
,然后使用filter()
,但不起作用。
不使用过滤器但获取正确输出的整形解决方案:
id <- c(1,1,1,1,2,2,2,2)
status <- c("offline","online","online","offline","online","online","online")
date <- c(2017,2018,2006,2006,2018,2002,2004)
tibble(id,status,date)
df %>%
group_by(id, status) %>%
arrange(desc(date)) %>%
summarize(date = first(date))
它应该屈服您:
A tibble: 4 x 3
# Groups: id [?]
id status date
<dbl> <chr> <dbl>
1 1 offline 2017
2 1 online 2018
3 2 offline 2006
4 2 online 2018
我认为这是一个容易的逻辑流,但这完全是主观的。
使用dplyr
,您可以做:
df %>%
group_by(id) %>%
filter(row_number() == 1 | submissions > first(submissions) & date >= first(date))
id status submissions date
<int> <chr> <int> <int>
1 1 offline 1 2017
2 1 online 2 2018
3 2 offline 1 2006
4 2 online 4 2018
假定offline
状态始终是每组第一行。
或offline
状态不是每组第一行时的情况的可能性:
df %>%
group_by(id) %>%
arrange(status, .by_group = TRUE) %>%
filter(row_number() == 1 | submissions > first(submissions) & date >= first(date))