Dplyr R: пропущенное значение, где требуется ИСТИНА / ЛОЖЬ " - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть набор данных последовательности, в котором я пытаюсь определить порядок последовательности на основе разницы дат (должно быть> £) наблюдений и трех других условий.

Я решил использовать mutate для создания столбца заказа, значение которого представляет собой счетчик, который упорядочивает записи на основе разницы дат между двумя записями и если наблюдения соответствуют определенному условию (mycheckfunc ()).

  dt <- dt %>%
  group_by(obsID) %>%
  arrange(row_index)%>%
  mutate(order = ifelse(row_index == 1, 1, 
                           ifelse(dateDiff > 3, 1,
                                  ifelse(mycheckfunc(lag(x), y, z,), 0, 1))))

Проверка включена, как показано ниже, и работает при отдельном тестировании

mycheckfunc<- function(x, y, z){

    if ((x %in% c(49,50,51,52,53,84)) | 
        (y %in% c(49,50,51,52,53,87)) | 
        (z %in% c("2B",81))){ 
      if(x == 19 & y == 51 & z == 21){
        return (FALSE) 
        }else{
          return (TRUE)
          }
      }else{
        return (FALSE)
      }
}

Я пытаюсь добиться следующего:

obsID row_index dateDiff    x   y   z  order
1     1          NA        19  20  15   1
1     2          0         19  51  21   1
1     3          2         49   1   1   2
1     4          0         1   49   1   3
2     1          NA        19   21  2B  1
2     2         381        ..   .. ..   1

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

 obsID row_index dateDiff    x   y   z  order
    1     1          NA      19  20  15   1
    1     2          0       19  51  21   1
    1     3          2       49   1   1   0
    1     4          0        1   49  1   0
    2     1          NA      19   21  2B  1
    2     2         381      ..   .. ..   1

Однако я получаю следующую ошибку и предупреждения

Error in mutate_impl(.data, dots) : missing value where TRUE/FALSE needed

In addition: Warning messages:
1: In if (x %in% c(49, 50, 51, 52, 53, 84) | y %in% c(49, 50, 51, 52,  :
  the condition has length > 1 and only the first element will be used

К сведению: у меня есть только NA в столбце dateDiff, который, я думаю, контролировал второй оператор ifelse в mutate. я не знаю, почему mycheckfunc возвращает NA .. Пожалуйста, помогите.

Я немного поиграл с мутированием и понял, что проблема связана с лагом (). Однако, поскольку я получаю задержку только для строк с предшественниками, она не должна быть нулевой ... все еще растоптанной. У меня есть след ниже

14: stop(list(message = "missing value where TRUE/FALSE needed", 
        call = mutate_impl(.data, dots), cppstack = NULL))
13: .Call("dplyr_mutate_impl", PACKAGE = "dplyr", df, dots)
12: mutate_impl(.data, dots)
11: mutate_.tbl_df(.data, .dots = lazyeval::lazy_dots(...))
10: mutate_(.data, .dots = lazyeval::lazy_dots(...))
9: mutate(., spOrder = ifelse(row_index == 1, 1, ifelse(dateDiff > 

Хорошо, проблема в том, что ошибка новичка: использование операторов if в пользовательском векторе. Мутация использует векторизованный список элементов, в то время как моя функция использовала оператор if, который, следовательно, не преобразовал его в оператор ifelse.

Однако кто-нибудь знает, как я могу обновить порядок на основе вышеуказанных условий для получения таблицы 1?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...