根据其唯一ID比较和过滤多行

时间:2019-05-19 09:24:35

标签: r

我有一个结构如下的数据框:

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(),但这是行不通的。

2 个答案:

答案 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

我认为这是一个稍微容易些的逻辑流程,但这完全是主观的。