Recodage des variables avec R
Recoder les variables dans R, semble être mon plus gros mal de tête. Quelles fonctions, paquets, processus utilisez-vous pour assurer le meilleur résultat?
J'ai trouvé très peu d'exemples utiles sur Internet qui donnent une solution unique au recodage et je suis intéressé de voir ce que vous utilisez.
Remarque: Il peut s'agir d'un sujet wiki communautaire.
5 réponses
Le recodage peut signifier beaucoup de choses, et est fondamentalement compliqué.
La modification des niveaux d'un facteur peut être effectuée à l'aide de la fonction levels
:
> #change the levels of a factor
> levels(veteran$celltype) <- c("s","sc","a","l")
Transformer une variable continue implique simplement l'application d'une fonction vectorisée:
Mtcars $ mpg.journal
Pour binning données continues regarder cut
et cut2
(dans le paquet hmisc). Par exemple:
> #make 4 groups with equal sample sizes
> mtcars[['mpg.tr']] <- cut2(mtcars[['mpg']], g=4)
> #make 4 groups with equal bin width
> mtcars[['mpg.tr2']] <- cut(mtcars[['mpg']],4, include.lowest=TRUE)
Pour recoder des variables continues ou factorielles dans un variable catégorique il y a recode
dans le package car et recode.variables
dans le package de déduction
> mtcars[c("mpg.tr2")] <- recode.variables(mtcars[c("mpg")] , "Lo:14 -> 'low';14:24 -> 'mid';else -> 'high';")
Si vous recherchez une interface graphique, Deducer implémente le recodage avec les boîtes de dialogue Transform et Recode:
Http://www.deducer.org/pmwiki/pmwiki.php?n=Main.TransformVariables
Http://www.deducer.org/pmwiki/pmwiki.php?n=Main.RecodeVariables
J'ai trouvé mapvalues
du paquet plyr
très pratique. Paquet contient également la fonction revalue
, qui est similaire à car:::recode
.
L'exemple suivant va "recoder"
> mapvalues(letters, from = c("r", "o", "m", "a", "n"), to = c("R", "O", "M", "A", "N"))
[1] "A" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "M" "N" "O" "p" "q" "R" "s" "t" "u" "v" "w" "x" "y" "z"
Je trouve cela très pratique lorsque plusieurs valeurs doivent être transformées (c'est comme faire des recodes dans Stata):
# load package and gen some data
require(car)
x <- 1:10
# do the recoding
x
## [1] 1 2 3 4 5 6 7 8 9 10
recode(x,"10=1; 9=2; 1:4=-99")
## [1] -99 -99 -99 -99 5 6 7 8 2 1
J'ai trouvé qu'il peut parfois être plus facile de convertir des facteurs non numériques en caractères avant d'essayer de les changer, par exemple.
df <- data.frame(example=letters[1:26])
example <- as.character(df$example)
example[example %in% letters[1:20]] <- "a"
example[example %in% letters[21:26]] <- "b"
En outre, lors de l'importation de données, il peut être utile de s'assurer que les nombres sont réellement numériques avant d'essayer de convertir:
df <- data.frame(example=1:100)
example <- as.numeric(df$example)
example[example < 20] <- 1
example[example >= 20 & example < 80] <- 2
example[example >= 80] <- 3
Lorsque vous souhaitez encoder les niveaux d'un facteur, forcats
peut venir dans maniable. Vous pouvez lire un chapitre de R pour Data Science pour un tutoriel complet, mais voici l'essentiel de celui-ci.
library(tidyverse)
library(forcats)
gss_cat %>%
mutate(partyid = fct_recode(partyid,
"Republican, strong" = "Strong republican",
"Republican, weak" = "Not str republican",
"Independent, near rep" = "Ind,near rep",
"Independent, near dem" = "Ind,near dem",
"Democrat, weak" = "Not str democrat",
"Democrat, strong" = "Strong democrat",
"Other" = "No answer",
"Other" = "Don't know",
"Other" = "Other party"
)) %>%
count(partyid)
#> # A tibble: 8 × 2
#> partyid n
#> <fctr> <int>
#> 1 Other 548
#> 2 Republican, strong 2314
#> 3 Republican, weak 3032
#> 4 Independent, near rep 1791
#> 5 Independent 4119
#> 6 Independent, near dem 2499
#> # ... with 2 more rows
Vous pouvez même laisser R décider quelles catégories (niveaux de facteur) fusionner ensemble.
Parfois, vous voulez juste regrouper tous les petits groupes pour rendre un tracé ou une table plus simple. C'est le travail de fct_lump(). [...] Le comportement par défaut est de grossir progressivement ensemble les plus petits groupes, en veillant à ce que l'agrégat est toujours le plus petit groupe.
gss_cat %>%
mutate(relig = fct_lump(relig, n = 10)) %>%
count(relig, sort = TRUE) %>%
print(n = Inf)
#> # A tibble: 2 × 2
#> relig n
#> <fctr> <int>
#> 1 Protestant 10846
#> 2 Other 10637