Как перекодировать переменные в 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.

Вопрос:

  1. Как я могу получить X и Y в кадре данных?
  2. Есть ли лучший способ для перекодирования переменных в кадре данных?

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) в самом цикле, и на последнем этапе вы можете cbindx а также 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() объединяет две строки, поэтому вы объединяете два списка в один.

Другие вопросы по тегам