2017-01-24 4 views
0

У меня есть dataframeИспользование dplyr для фильтрации строк

soDf <- structure(list(State = c("Exception", "Exception", "Exception", "Exception", "Approval", "Processing"), User = c("1","2", "1", "3", "1", "4"), Voucher.Number = c(10304685L, 10304685L, 10304685L,10304685L, 10304685L, 10304685L), Queue.Exit.Date = c("8/24/2016 14:59", "8/26/2016 13:25", "8/26/2016 15:56", "8/26/2016 16:13", "8/26/2016 16:25", "8/26/2016 17:34")),.Names = c("State", "User", "Voucher.Number","Queue.Exit.Date"), row.names = 114:119, class = "data.frame") 

У меня есть список правил, которые я хочу, чтобы отфильтровать строки по:

Одним из правил является

(Voucher.Number == lag(Voucher.Number)) & (State == 'Exception' & lag(State) == 'Exception') 

Если текущее и отставание ваучера числа равны, и оба имеют тег исключения, а затем отметьте эту строку как True.

Когда я применить это правило с парой другой возвращает 4-й строку как True, когда она должна быть возвращена в False

 State User Voucher.Number Queue.Exit.Date toFilt 
1 Exception 1  10304685 8/24/2016 14:59  NA 
2 Exception 2  10304685 8/26/2016 13:25 TRUE 
3 Exception 1  10304685 8/26/2016 15:56 TRUE 
4 Exception 3  10304685 8/26/2016 16:13 TRUE 
5 Approval 1  10304685 8/26/2016 16:25 FALSE 
6 Processing 4  10304685 8/26/2016 17:34 FALSE 

Вот код, который я использовал со всеми правилами фильтрации

soDf <- soDf %>% 
    arrange(Voucher.Number, Queue.Exit.Date)%>% 
    mutate(toFilt = ((User == lag(User)& Voucher.Number ==lag(Voucher.Number)))| 
      ((Voucher.Number != lag(Voucher.Number)) & State == "Exception") | 
      ((Voucher.Number == lag(Voucher.Number)) & (State == 'Exception' & lag(State) == 'Exception'))| 
      ((Voucher.Number == lag(Voucher.Number)) & (User == lag(User)))) 
+0

Вы имеете в виду 'soDf%>% filter ((Voucher.Number == lag (Voucher.Number)) & (State == 'Exception' & lag (State) == 'Exception'))' ... you нужно вызвать 'filter' для того, чтобы ... well..filter ваши данные – Sotos

+0

@Sotos Я не включил более поздний код, но я использую' filter' для фильтрации строк == True. В тот момент им хотелось увидеть результат ... ну, потому что я заинтересовался им. – daveDo

+0

В вашем вопросительном коде просто замените 'mutate (toFilt = ....)' на 'filter (((User == ...)))' – Sotos

ответ

0

Строка 5 не соответствует вашему условному выражению в столбце mutate. Состояние строки 5 - «Утверждение», а не «Исключение», а идентификатор пользователя не соответствует идентификатору пользователя с задержкой.

По этой причине он возвращает FALSE, поскольку ни одно из 4 утверждений TRUE. Это не похоже на ошибку кодирования, которую требует только условное выражение, чтобы оно соответствовало вашим потребностям. Надеюсь это поможет!

+0

Я хотел сказать 4-й ряд – daveDo

+0

Критерий встречается на условном заявление на 4-й строке. Он возвращает TRUE, поскольку 3-е условие имеет значение TRUE: ((Voucher.Number == lag (Voucher.Number)) & (State == 'Exception' & lag (State) == 'Exception')) – George

Смежные вопросы