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.

24
r
demandé sur Brandon Bertelsen 2011-03-21 04:13:32

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

20
répondu Ian Fellows 2011-03-21 03:24:14

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"
10
répondu Roman Luštrik 2014-11-11 13:33:06

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
9
répondu petermeissner 2013-12-03 21:25:07

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
5
répondu Brandon Bertelsen 2011-03-21 18:06:36

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
2
répondu Fato39 2017-07-26 08:14:30