我有一个结构如下的数据框:
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
我曾尝试先使用dplyr group_by()
,然后再使用filter()
,但这是行不通的。
答案 0 :(得分:0)
使用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))
答案 1 :(得分:0)
不使用过滤器但可获得正确输出的tidyverse解决方案:
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
我认为这是一个稍微容易些的逻辑流程,但这完全是主观的。