transformar - show variable in r
Recodificación de variables con R (5)
Recodificar variables en R, parece ser mi mayor dolor de cabeza. ¿Qué funciones, paquetes y procesos utiliza para garantizar el mejor resultado?
He encontrado muy pocos ejemplos útiles en Internet que dan una solución de talla única para la recodificación y estoy interesado en ver qué están usando ustedes y las chicas.
Nota: Este puede ser un tema wiki de la comunidad.
Cuando desee recodificar niveles de un factor, los forcats
pueden ser útiles. Puedes leer un capítulo de R para Data Science para un extenso tutorial, pero aquí está lo esencial.
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
Incluso puede dejar que R decida qué categorías (niveles de factor) se fusionan.
A veces, solo desea agrupar a todos los grupos pequeños para simplificar el trazado o la tabla. Ese es el trabajo de fct_lump (). [...] El comportamiento predeterminado es agrupar progresivamente a los grupos más pequeños, asegurando que el agregado sigue siendo el grupo más pequeño.
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
Descubrí que a veces puede ser más fácil convertir factores no numéricos en caracteres antes de intentar cambiarlos, por ejemplo.
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"
Además, al importar datos, puede ser útil asegurarse de que los números sean realmente numéricos antes de intentar 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
Encontré mapvalues
del paquete plyr
muy útil. El paquete también contiene la función de revalue
que es similar a car:::recode
.
El siguiente ejemplo será "recodificar"
> 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"
La recodificación puede significar muchas cosas, y es fundamentalmente complicada.
El cambio de los niveles de un factor se puede hacer usando la función de levels
:
> #change the levels of a factor
> levels(veteran$celltype) <- c("s","sc","a","l")
Transformar una variable continua simplemente implica la aplicación de una función vectorizada:
mtcars $ mpg.log <- log (mtcars $ mpg)
Para agrupar datos continuos, consulte cut
y cut2
(en el paquete hmisc). Por ejemplo:
> #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)
Para recodificar variables continuas o factoriales en una variable categórica, hay recode
en el paquete car y recode.variables
en el paquete Deducer
> mtcars[c("mpg.tr2")] <- recode.variables(mtcars[c("mpg")] , "Lo:14 -> ''low'';14:24 -> ''mid'';else -> ''high'';")
Si está buscando una GUI, Deducer implementa la recodificación con los cuadros de diálogo Transformar y Recodificar:
http://www.deducer.org/pmwiki/pmwiki.php?n=Main.TransformVariables
http://www.deducer.org/pmwiki/pmwiki.php?n=Main.RecodeVariables
Me parece muy conveniente cuando se deben transformar varios valores (es como hacer recodificaciones en 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