Сравнить и отфильтровать несколько строк на основе их уникального идентификатора - PullRequest
2 голосов
/ 19 мая 2019

У меня есть фрейм данных с такой структурой:

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 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 голосов
/ 19 мая 2019

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

Я думаю, что это немного проще логический потокно это совершенно субъективно.

0 голосов
/ 19 мая 2019

С 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...