Замена вложенного ifelse с помощью purrr & modify_if - PullRequest
0 голосов
/ 09 мая 2020

Это одна из тех вещей, которых я пытаюсь достичь. Почему-то думаете, что использование purrr и "modify_if" будет более эффективным? В приложении он будет быстро расти, поэтому важны скорость / эффективность. Это выглядит просто, но то, что мне нужно сделать, потребует нескольких команд на каждом уровне ifelse.

vec1 <- c(1,2,3)
vec1 <- sapply(
  vec1,function(x) ifelse(x == 1,2,
                          ifelse (x == 2,3,
                                  ifelse (x == 3,1,0))))
vec1 #output
[1] 2 3 1

Кроме того, как я могу закодировать ifelse, если другого нет, т.е. не встретил я просто ничего не хочу делать? Просто используйте оператор if вместо ifelse.

Thx, J

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Мы также можем использовать именованный вектор в base R без использования каких-либо пакетов или ifelse

unname(setNames(1:3, c(2, 3, 1))[as.character(vec1)])
0 голосов
/ 09 мая 2020

Здесь sapply не требуется, ifelse векторизован, вы можете использовать его напрямую.

В качестве альтернативы вы можете использовать dplyr::recode.

dplyr::recode(vec1, `1` = 2, `2` = 3, `3` = 1)
#[1] 2 3 1

или case_when, который является альтернативой вложенным операторам ifelse.

dplyr::case_when(vec1 == 1 ~2, vec1 == 2 ~3,  vec1 == 3 ~1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...