У меня есть набор данных последовательности, в котором я пытаюсь определить порядок последовательности на основе разницы дат (должно быть> £) наблюдений и трех других условий.
Я решил использовать 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?