2014-11-20 6 views
1

У меня есть dataframe с разными переменными, содержащими значения от 1 до 5. Я хочу перекодировать некоторые переменные таким образом, что 5 становится 1 и наоборот (x = 6- Икс). Я хочу определить список переменных, которые будут перекодированы, как это в моем dataframe.Как перекодировать набор переменных в фрейме данных в R

Вот мой подход, используя lapply. Я еще этого не понимал.

#generate example-dataset 
    var1<-sample(1:5,100,rep=TRUE) 
    var2<-sample(1:5,100,rep=TRUE) 
    var3<-sample(1:5,100,rep=TRUE) 
    dat<-as.data.frame(cbind(var1,var2,var3)) 

    recode.list<-c("var1","var3") 
    recode.function<- function(x){   
    x=6-x 
    } 
    lapply(recode.list,recode.function,data=dat) 
+1

Расчет 6-х в этом случае довольно прост, но если у вас есть более конкретные шаблоны перекодировки, вы можете проверить пользовательскую функцию «перекодировать» из пакета «автомобиль». – agenis

ответ

6

Там нет необходимости для внешней функции или пакета для этого. Просто используйте анонимную функцию в lapply, как это:

df[recode.list] <- lapply(df[recode.list], function(x) 6-x) 

Использование [] позволяет нам заменить только те столбцы, непосредственно в исходном наборе данных. Это необходимо, так как только использование lapply приведет к получению данных в виде имени list.


Как было отмечено в комментариях, вы можете даже пропустить lapply:

df[recode.list] <- 6 - df[recode.list] 
+0

Благодарим вас за помощь. Так или иначе, я получаю следующее сообщение при применении кода к моим данным: «Ошибка в'. .data.frame' (df, recode.list): не определены выбранные столбцы ». Что это может означать? – SEMson

+0

@ user2982730, похоже, что это означает, что ваш «recode.list» содержит столбцы, которые не найдены в источнике 'data.frame'. – A5C1D2H2I1M1N2O1R2T1

1

Вот вариант, чтобы сделать это с dplyr:

recode.function<- function(x){   
    x <- 6-x 
} 

recode.list <- c("var1","var3") 

require(dplyr) 
df %>% mutate_each_(funs(recode.function), recode.list) 

# var1 var2 var3 
#1  2 2 4 
#2  3 3 3 
#3  3 5 2 
#4  3 3 2 
#5  4 3 3 
#6  5 4 1 
#... 
1

Вы можете использовать mapvalues из plyr.

require(plyr) 
# if you just want to replace 5 with 1 and vice versa 
df[, recode.list] <- sapply(df[, recode.list], mapvalues, c(1, 5), c(5,1)) 
# if you want to apply to x=6-x to all values (in this case you don't need mapvalues) 
df[, recode.list] <- sapply(df[, recode.list], mapvalues, 1:5, 5:1)