Более эффективный подход к перекодированию переменной, чем mutate(ifelse)?

#r #dplyr

#r #dplyr

Вопрос:

Я хотел бы перекодировать переменные, но я подозреваю, что есть более эффективное решение, чем вложенные if операторы. Например, есть ли способ изменить имя содержимого столбца без ifelse объединения с mutate .

Если у нас есть:

 col
F
M
 

Я хочу изменить значения, как показано на рисунке:

 col
1
0
 

Я пытался использовать mutate :

 mutate(col = ifelse(col == F, 1, 0))
 

Есть ли какой-нибудь другой эффективный способ? Например, когда у нас есть col с несколькими вариантами, использование ifelse будет утомительным.

Комментарии:

1. См. help("case_when")

2. Обзор: В вопросе отсутствуют некоторые теги, например, какой язык используется, и, возможно, некоторые более полезные теги. Добавление исходного кода (предварительно отформатированного) для ваших результатов — это нормально, IMO.

3. @H.Hasenack у него есть r тег, указывающий, какой язык используется: R

4. @duckmayr — извините, я это упустил. против.

Ответ №1:

Это распространенная проблема, к которой я лично предпочитаю подходить с dplyr::recode :

Представьте, что у вас есть data.frame с именем data :

 data <- data.frame(col = LETTERS[c(1:5,1:2)])
data
#  col
#1   A
#2   B
#3   C
#4   D
#5   E
#6   A
#7   B
 

Вы можете использовать recode со списком value = replacement пар:

 data %>% 
  mutate(col = recode(col, "A" = 1, "B" = 2,
                      "C" = 3, "D" = 4, "E" = 5))
#  col
#1   1
#2   2
#3   3
#4   4
#5   5
#6   1
#7   2
 

Если есть шаблон для ваших замен, вы можете пофантазировать с именованным вектором замен и !!! :

 my.replacements <- setNames(1:5,LETTERS[1:5])
my.replacements
#A B C D E 
#1 2 3 4 5 

data %>% 
  mutate(col = recode(col, !!!my.replacements))
#  col
#1   1
#2   2
#3   3
#4   4
#5   5
#6   1
#7   2
 

Ответ №2:

Может быть, вы можете попробовать

  • match
 within(df, col <- match(col, c("M", "F")) - 1)
 
  • factor
 within(df, col <- as.integer(factor(col, levels = c("M", "F"))) - 1)
 
  • ==
 within(df, col <- c(0, 1)[1   (col == "F")])