#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
тег, указывающий, какой язык используется: R4. @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")])