2015-12-07 4 views
0

Я пытаюсь перекодировать переменные в фреймворк R. Пример - переменная X из моего набора данных содержит 1 и 0. Я хочу создать другие переменные Y, которые перекодируют 1 & 0 из X в Да & Нет соответственно.Как перекодировать переменные в R

Я попытался это создать перекодировано 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" 

Я ожидал dataframe с X & Y столбцов.

Вопрос:

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

выход вашей петли ж и нигде после ... и это должно быть y <- as.data.frame (cbind (x, y)) – MLavoie

+1

И нет необходимости в цикле. Используйте что-то вроде 'ifelse' – etienne

+5

use' factor (x, levels = c (0, 1), labels = c («Нет», «Да»)) 'вместо цикла. – rcs

ответ

1

Это один из многих случаев, когда вы действительно не должны использовать цикл в R.

Вместо этого используйте векторизации, т.е. ifelse или индексации.

result = data.frame(x = x, y = ifelse(x == 1, 'yes', 'no')) 

(Это предполагает, что есть только 1s и 0s на входе, если это не так, то вам нужно вложенную ifelse или список, содержащий переводы).

+0

Спасибо Konrad. Ваше предложение работает хорошо. Но у меня теперь немного другой пример ... я создаю следующий файл данных ... x <- c («да», «да», «нет», «да», «нет») ... y <- c («да», «нет», «нет», «да», «да») ... df <- cbind (x, y) .... и я делаю это .... dfNew <- data .frame (x = x, y = y, recode = ifelse ((x == "yes") && (y == "yes"), 1, 0)) .... двойное условие x & y не работает. Все значения в перекодированной переменной возвращаются как 1. Пожалуйста, сообщите. Спасибо – KYG

+0

@KYG Замените '&&' на '&'. –

1

Используя следующие данные:

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

3

перекодирования, как правило, о применении новых меток на уровни фактора (категориальной переменной)

В R, вы делаете это так:

w <- factor(x, levels = c(1,0), labels = c('yes', 'no')) 
+0

Хм, интересно, видели ли вы комментарий полчаса назад и просто скопировали/вставляли ... –

+1

@David Возможно, так, но тогда комментатор отменил свое право опубликовать его в качестве правильного ответа в течение этого получаса. –

+0

@ KonradRudolph его все еще не подходит без какой-либо атрибуции. Более того [это уже много раз обсуждалось в Meta] (http://meta.stackoverflow.com/a/251598/3001626). –

Смежные вопросы