Фитлер на основе парных полей для сгруппированных идентификаторов - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь найти фильтр для идентификации идентификаторов для следующего кадра данных.

x <- data.frame("log_id" = c(16006,16006,16006,25109,25109,25109,25109,20506,20506),
                "status" = c(0,1,1,0,1,1,1,0,1), 
                "version" = c(1,2,3,1,2,3,4,1,2),
                "date_time" = c(as.Date("2018-10-27 00:00:00"), as.Date("2019-01-06 00:00:00"),as.Date("2019-01-16 00:00:00"),
                                as.Date("2018-10-27 00:00:00"), as.Date("2017-01-06 00:00:00"), as.Date("2019-02-17 00:00:00"),
                                as.Date("2018-10-27 00:00:00"), as.Date("2019-01-12 00:00:00"),as.Date("2019-02-12 00:00:00")))

Мне нужно идентифицировать идентификаторы так, чтобы date_time, связанный с более высокими номерами версий, после группировки по log_id должен был быть более поздним, чем предыдущие версии.

Другими словами, для каждого log_id записи с более высокой версией должны иметь datetime> =, чем предыдущие. Мне нужно найти log_id с событиями, которые не соответствуют этому условию, и записать определенный «log_id».

Я попробовал решение dplyr, основанное на group_by, и сделал с ifelse, но не смог получить правильный синтаксис.

solution <- x %>%
  select(log_id,
         status,
         version,
         date_time) %>%
  group_by(log_id) %>%
  {(ifelse(date_time[version== 1] < date_time[version!=  1], 0,1))} %>%
  arrange(log_id)

Я ожидаю, что результаты будут храниться в векторе, чтобы идентифицировать все проблемные "log_id".

Для этого кадра данных ожидаемый результат:

"incidented log_id = " "25109"

Причина в том, что log_id = 25109 имеет значение date_time ("2017-01-06 00:00:00"), связанное с его версией = 2 старше, чем значение date_time ("2018-10-27 00:00: 00 ") связано с его версией = 1.

1 Ответ

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

Посмотрите, выполняет ли следующее то, что вам нужно.
Группирует по log_id, а затем вычисляет разницу между значениями date_time.Если различия меньше нуля, то предыдущие date_time выше и просто filter по этому логическому результату.

Первая версия хранит целые строки, где следующая date_time меньше предыдущей

x %>%
  group_by(log_id) %>%
  filter(c(0, diff(date_time)) < 0)
## A tibble: 2 x 4
## Groups:   log_id [1]
#  log_id status version date_time 
#   <dbl>  <dbl>   <dbl> <date>    
#1  25109      1       2 2017-01-06
#2  25109      1       4 2018-10-27

Вторая версия возвращает только проблемные log_id.

x %>%
  group_by(log_id) %>%
  filter(c(0, diff(date_time)) < 0) %>%
  select(log_id) %>%
  unique()
## A tibble: 1 x 1
## Groups:   log_id [1]
#  log_id
#   <dbl>
#1  25109
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...