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
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.
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