2016-01-08 1 views
0

J'ai un grand ensemble de données d'enquête contenant 110 variables. Certaines réponses vont de 1 à 5, où 1 est le meilleur et 5 est le pire. Pour l'analyse, je voudrais inverser cela, où 5 = 1, 4 = 2, 3 = 3, 2 = 4 et 1 = 5.recoder dans la même variable

Si je mets dans un objet, il fonctionne:

x_inv <- recode(x, "5=1; 4=2;3=3;2=4; 1=5") 

Pourtant, si je fais ça, je vais finir avec 110 objets. Ainsi, je cherche un moyen de changer cette variable directement dans la trame de données.

que j'ai essayé tout recoder:

recode(x, "5=1; 4=2;3=3;2=4; 1=5") 

Cela fonctionne si vous regardez cette variable, mais si vous demandez la moyenne, il n'a pas changé, par exemple 1,82 à 4,18.

Est-ce que quelqu'un sait comment faire cela?

+1

Si les valeurs sont numériques, pourquoi ne pas simplement faire 6 - x'? – Benjamin

+0

Merci! Mais alors je devrais faire cela pour toutes les observations dans l'ensemble de données. Y a-t-il une possibilité dans R de simplement recoder une variable dans le même? – Frieda

+0

Juste 'données $ réponse <- (6 - données $ réponse)'. – Mutador

Répondre

0

Voici une illustration plus détaillée de la façon dont je le ferais.

library(car) #* contains the recode function 

#* Construct a sample data set 
DFrame <- lapply(1:10, 
       function(i) sample(1:5, 15, replace = TRUE)) 
DFrame <- as.data.frame(DFrame) 
set.seed(pi) 
DFrame$id = LETTERS[1:15] 
DFrame <- DFrame[, c(11, 1:10)] 
names(DFrame)[-1] <- paste0("Var", 1:10) 

DFrame 

#* Identify variables that need to be recoded. 
#* Searches for any variable that has only values in 1:5 
var_to_reverse <- 
    vapply(DFrame, 
     function(x) all(x %in% 1:5), 
     logical(1)) 

#* In your case, I think recode is a bit of overkill 
#* Here's how to do it with 6 - x 
DFrame2 <- DFrame 
DFrame2[, var_to_reverse] <- 
    lapply(DFrame2[, var_to_reverse, drop = FALSE], 
     function(x) 6 - x) 

#* Here's how to do it with recode, if you have a more complex situation. 
DFrame3 <- DFrame 
DFrame3[, var_to_reverse] <- 
    lapply(DFrame3[, var_to_reverse, drop = FALSE], 
     recode, 
     recodes = "5=1; 4=2;3=3;2=4; 1=5") 

#* confirm that both methods provide the same result. 
identical(DFrame2, DFrame3) 
+0

Parfait! Merci :-) J'ai utilisé le recode, ça marche! – Frieda