Как перекодировать переменные в R
Я пытаюсь перекодировать переменные в кадре данных R. Пример - переменная X из моего набора данных содержит 1 и 0. Я хочу создать еще одну переменную Y, которая перекодирует 1 и 0 из X в Да и Нет соответственно.
Я попытался это создать перекодированную переменную Y:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- cbind(w, recode)
}
Затем я сделал это, чтобы совместить X и Y вместе:
y <- c(x, y)
То, что я получил, было этим:
y
# [1] "1" "1" "0" "1" "0" "0" "1" "1" "0" "1" "0" "0" "Yes" "Yes" "No" "Yes" "No" "No"
Я ожидал фрейм данных со столбцами X & Y.
Вопрос:
- Как я могу получить X и Y в кадре данных?
- Есть ли лучший способ для перекодирования переменных в кадре данных?
3 ответа
Это один из многих случаев, когда вы действительно не должны использовать цикл в R.
Вместо этого используйте векторизацию, т.е. ifelse
или индексация.
result = data.frame(x = x, y = ifelse(x == 1, 'yes', 'no'))
(Предполагается, что на входе есть только 1 и 0; если это не так, вам нужен вложенный ifelse
или список, содержащий переводы).
Рекодирование, как правило, касается применения новых меток к уровням фактора (категориальная переменная)
В R вы делаете это так:
w <- factor(x, levels = c(1,0), labels = c('yes', 'no'))
Используя следующие данные:
x <- c(rep.int(0, 10), rep.int(1, 10))
df <- as.data.frame(x)
df
# x
# 1 0
# 2 0
# 3 0
# ...
Я бы создал новую переменную и перекодировал бы за один шаг:
df$y[df$x == 1] <- "yes"
df$y[df$x == 0] <- "no"
df
# x y
# 1 0 no
# 2 0 no
# 3 0 no
# ...
# 11 1 yes
# 12 1 yes
# 13 1 yes
# ...
Заметка for
циклы не оптимальны в R, но ваш цикл в основном правильный. Вам нужно заменить w <- rbind(w, recode)
с w <- cbind(w, recode)
в самом цикле, и на последнем этапе вы можете cbind
x
а также w
:
w <- as.character()
for (i in seq_along(x)) {
if (x[i] == 1) {
recode <- "Yes"
} else if (x[i] == 0) {
recode <- "No"
}
w <- rbind(w, recode)
}
y <- c(x, w)
y
rbind()
добавляет строки, cbind()
добавляет столбцы и c()
объединяет две строки, поэтому вы объединяете два списка в один.