web-dev-qa-db-fra.com

R: Comment recoder plusieurs variables à la fois

Dans mon jeu de données, plusieurs variables doivent être recodées exactement de la même manière, et plusieurs autres variables doivent être recodées de manière différente. J'ai essayé d'écrire une fonction pour m'aider, mais j'ai des problèmes.

library(dplyr)
recode_liberalSupport = function(arg1){
  arg1 = recode(arg1, "1=-1;2=1;else=NA")
  return(arg1)
}

liberals = c(df$var1, df$var4, df$var8)
for(i in unique(liberals)){
  paste(df$liberals[i] <- sapply(liberals, FUN = recode_liberalSupport))
}

R studio travaille dessus pendant environ 5 minutes puis me donne ce message d'erreur:

Error in `$<-.data.frame`(`*tmp*`, liberals, value = c(NA_real_, NA_real_,  : 
  replacement has 9 rows, data has 64600
In addition: Warning messages:
1: Unknown or uninitialised column: 'liberals'. 
2: In df$liberals[i] <- sapply(liberals, FUN = recode_liberalSupport) :
  number of items to replace is not a multiple of replacement length

Toute aide sera grandement appréciée! Je vous remercie

3
Bertrand

C'est mieux je pense avec dplyr . Utiliser correctement recode est une bonne idée. mutate_all() peut être utilisé pour agir sur l'ensemble de la trame de données, mutate_at() sur les variables sélectionnées uniquement. Il existe de nombreuses façons de spécifier des variables dans dplyr .

mydata <- data.frame(arg1=c(1,2,4,5),arg2=c(1,1,2,0),arg3=c(1,1,1,1))

mydata

  arg1 arg2 arg3
1    1    1    1
2    2    1    1
3    4    2    1
4    5    0    1

mydata <- mydata %>% 
     mutate_at(c("arg1","arg2"), funs(recode(., `1`=-1, `2`=1, .default = NaN)))

mydata

  arg1 arg2 arg3
1   -1   -1    1
2    1   -1    1
3  NaN    1    1
4  NaN  NaN    1

J'utilise NaN au lieu de NA car il est numérique, il est plus simple de le gérer dans une colonne composée d'autres chiffres.

9
Stephen Henderson

Comme toujours, il y a plusieurs façons de le faire. Je ne connais pas assez dplyr pour utiliser cette fonction, mais cela semble être ce que vous recherchez.

mydata <- data.frame(arg1=c(1,2,4,5),arg2=c(1,1,2,0))
mydata
  arg1 arg2
1    1    1
2    2    1
3    4    2
4    5    0

Fonction pour recoder à l'aide d'une ifelse() imbriquée

recode_liberalSupport <- function(var = "arg1", data=mydata) {
+   recoded <- ifelse(mydata[[var]] == 1, -1,
+                           ifelse(mydata[[var]] == 2, 1, NA))
+   return(recoded)
+ }

Appelle la fonction

recode_liberalSupport(var = "arg1")
[1] -1  1 NA NA

Remplacez la variable arg1 par des valeurs recodées.

mydata$arg1 <- recode_liberalSupport(var = "arg1") 
mydata
  arg1 arg2
1   -1    1
2    1    1
3   NA    2
4   NA    0
0
akaDrHouse