dplyr if_else () против базы R ifelse () - PullRequest
0 голосов
/ 01 июня 2018

Я достаточно опытен в Tidyverse, но всегда использовал ifelse() вместо dplyr if_else().Я хочу изменить это поведение и по умолчанию всегда использовать dplyr::if_else() и исключать ifelse() из моего кода.

Есть ли причина не делать этого?Может ли это привести меня к неприятностям?Я избавлю вас от подробностей, но недавно, не используя if_else(), облажался, когда я по незнанию создал столбец символьных матриц в своем анализе данных.Если я всегда буду использовать if_else(), я надеюсь избежать этой проблемы в будущем.

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Другая причина выбора if_else вместо ifelse состоит в том, что ifelse превращает Date в numeric объекты

Dates <- as.Date(c('2018-10-01', '2018-10-02', '2018-10-03'))
new_Dates <- ifelse(Dates == '2018-10-02', Dates + 1, Dates)
str(new_Dates)

#>  num [1:3] 17805 17807 17807

if_else также быстрее, чем ifelse.

Обратите внимание, что при тестировании нескольких условий код будет более читабельным и менее подверженным ошибкам, если мы используем case_when.

library(dplyr)

case_when(
  Dates == '2018-10-01' ~ Dates - 1,
  Dates == '2018-10-02' ~ Dates + 1,
  Dates == '2018-10-03' ~ Dates + 2,
  TRUE ~ Dates
)

#> [1] "2018-09-30" "2018-10-03" "2018-10-05"

Создано в 2018-06-01 представляет пакет (v0.2.0).

0 голосов
/ 22 октября 2018

Я бы также добавил, что if_else() может присвоить значение в случае NA, что является удобным способом добавления дополнительного условия.

df <- data_frame(val = c(80, 90, NA, 110))
df %>% mutate(category = if_else(val < 100, 1, 2, missing = 9))

#     val category
#   <dbl>    <dbl>
# 1    80        1
# 2    90        1
# 3    NA        9
# 4   110        2
0 голосов
/ 01 июня 2018

if_else более строгий.Он проверяет, что обе альтернативы имеют одинаковый тип, и в противном случае выдает ошибку, в то время как ifelse будет продвигать типы по мере необходимости.В некоторых случаях это может быть полезным, но в противном случае может нарушить работу сценариев, если вы не проверяете наличие ошибок или явно не приводите принудительное преобразование типов.Например:

ifelse(c(TRUE,TRUE,FALSE),"a",3)
[1] "a" "a" "3"
if_else(c(TRUE,TRUE,FALSE),"a",3)
Error: `false` must be type character, not double
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...