hllinas2023

1 Librerías

library(dplyr)
library(plyr)
library(forcats)
library(car)

2 Data frame

Recuerde que el data frame (básicamente una tabla) es en realidad solo un tipo específico de otra estructura de datos (la lista). Actualmente, es el formato de entrada de nuestros datos más frecuente para los análisis estadísticos (dentro de R, pero también para otros programas estadísticos y, por supuesto, para softwares de hojas de cálculo). Por esta razón, primero, es importante importar/cargar los datos antes de iniciar nuestro análisis. Esto ya se explicó en el documento Rpubs :: Importar datasets.

En los documentos Rpubs :: Examinar data frames y Rpubs :: Examinar data frames explicamos algunas funciones de R que nos permiten revisar propiedades de los data frames de las variables que contenidas en él. En este documento, explicaremos como recodificar las variables. Para más detalles relacionados con los data frames, se puede consultar el documento Rpubs :: data frames (generalidades).

3 Recodificar variables categóricas y numéricas

3.0.1 Con vectores indexados

Conteo <- c("Uno", "Dos", "Tres", "Cuatro", "Cinco")
Grado   <- character(length(Conteo))
Grado[Conteo == "Uno"] <- "Primero"
Grado[Conteo == "Dos"] <- "Segundo"
Grado[Conteo == "Tres"] <- "Tercero"
Grado[Conteo == "Cuatro"] <- "Cuarto"
Grado[Conteo == "Cinco"] <- "Quinto"
Grado
## [1] "Primero" "Segundo" "Tercero" "Cuarto"  "Quinto"

3.0.2 Con replace

replace(c(1, 2, 3, 4, 5, 6), list=c(3, 5), values=c(30, 50))
## [1]  1  2 30  4 50  6
replace(c(1, 2, 3, 4, 5, 6), list=c(3, 5), values=c("A", "B"))
## [1] "1" "2" "A" "4" "B" "6"

3.0.3 Con dplyr::recode

dplyr::recode(Conteo, Uno="Primero", Dos="Segundo", Tres="Tercero", Cuatro="Cuarto", Cinco="Quinto")
## [1] "Primero" "Segundo" "Tercero" "Cuarto"  "Quinto"
dplyr::recode(Conteo, Dos="Par", Cuatro="Par", .default="Impar")
## [1] "Impar" "Par"   "Impar" "Par"   "Impar"

3.0.4 Con ifelse

Numero <- c(1:4, 2:5)
umbral <- 3
R1 <- ifelse(Numero < umbral, umbral, Numero); R1
## [1] 3 3 3 4 3 3 4 5
R2 <- ifelse(Numero < 3, 1, 0); R2
## [1] 1 1 0 0 1 0 0 0
R3 <- ifelse(Numero < 3, "M", "F"); R3
## [1] "M" "M" "F" "F" "M" "F" "F" "F"
Nivel  <- c("Cero", "Tres", "Cinco", "Siete", "Nueve")
ifelse(Nivel %in% Conteo, Nivel, "Otro")
## [1] "Otro"  "Tres"  "Cinco" "Otro"  "Otro"

4 Agrupar variables continuas en categorías

4.0.1 Usando ifelse

N <- 1:6
ifelse(N > 3, "Alto", "Bajo")
## [1] "Bajo" "Bajo" "Bajo" "Alto" "Alto" "Alto"

4.0.2 Usando dplyr::case_when

#library(dplyr)
case_when((N <= 2)            ~ 1,
          (N > 2) & (N <= 4)  ~ 2,
          (N > 4)             ~ 3)
## [1] 1 1 2 2 3 3
#library(dplyr)
case_when((N <= 2)            ~ "Bajo",
          (N > 2) & (N <= 4)  ~ "Medio",
          (N > 4)             ~ "Alto")
## [1] "Bajo"  "Bajo"  "Medio" "Medio" "Alto"  "Alto"

4.0.3 Usando cut

N_cat <- cut(N, breaks=c(0, 2, 4, Inf), labels=c("Bajo", "Medio", "Alto"))
summary(N_cat)
##  Bajo Medio  Alto 
##     2     2     2
N_cat <- cut(N, breaks=c(-Inf, median(N), Inf))
summary(N_cat)
## (-Inf,3.5] (3.5, Inf] 
##          3          3
N_cat <- cut(N, quantile(N), include.lowest=TRUE)
summary(N_cat)
##   [1,2.25] (2.25,3.5] (3.5,4.75]   (4.75,6] 
##          2          1          1          2

5 Recodificar factores

5.0.1 Con levels

Sexo <- c(1, 1, 0, 1, 0)
levels(Sexo) <- c("Femenino", "Masculino")
Sexo
## [1] 1 1 0 1 0
## attr(,"levels")
## [1] "Femenino"  "Masculino"

5.0.2 Con levels=…, labels=…

Sexo_cat <- factor(Sexo, levels=c(0, 1), labels=c("F", "M"))
Sexo_cat
## [1] M M F M F
## Levels: F M

5.0.3 Con forcats :: fct_recode

#library(forcats)
fct_recode(Sexo_cat, "Female"="F", "Male"="M")
## [1] Male   Male   Female Male   Female
## Levels: Female Male

5.0.4 Con plyr :: revalue

x <- c("a", "Otro", "c")
plyr::revalue(x, c(a = "Bajo", c = "Alto"))
## [1] "Bajo" "Otro" "Alto"
plyr::revalue(x, c("a" = "Bajo", "c" = "Alto"))
## [1] "Bajo" "Otro" "Alto"
y <- factor(c("a", "Otro", "c", "a"))
plyr::revalue(y, c(a = "Bajo", c = "Alto"))
## [1] Bajo Otro Alto Bajo
## Levels: Bajo Alto Otro

5.0.5 Con car :: recode

x<-rep(1:4,3)
car::recode(x, "c(1,2)='A'; else='B'")
##  [1] "A" "A" "B" "B" "A" "A" "B" "B" "A" "A" "B" "B"
car::Recode(x, "1:2='A'; 3='B'")
##  [1] "A" "A" "B" "4" "A" "A" "B" "4" "A" "A" "B" "4"

6 Añadir niveles

6.0.1 Con factor

Estatura <- factor(c("Alta", "Baja", "Alta", "Alta", "Baja"))
Estatura[6] <- "Media"
Estatura
## [1] Alta Baja Alta Alta Baja <NA>
## Levels: Alta Baja

6.0.2 Con levels

levels(Estatura) <- c(levels(Estatura), "Media")
Estatura[6] <- "Media"
Estatura
## [1] Alta  Baja  Alta  Alta  Baja  Media
## Levels: Alta Baja Media

6.0.3 Con forcats :: fct_expand

#library(forcats)
fct_expand(Estatura, "Otro")
## [1] Alta  Baja  Alta  Alta  Baja  Media
## Levels: Alta Baja Media Otro

7 Combinar niveles

7.0.1 Con levels

datos <- Estatura
levels(datos) <- list(Alta="Alta", No=c("Media", "Baja"))
datos
## [1] Alta No   Alta Alta No   No  
## Levels: Alta No

7.0.2 Con forcats :: fct_expand

library(forcats)
fct_collapse(Estatura, No=c("Media", "Baja"))
## [1] Alta No   Alta Alta No   No  
## Levels: Alta No

8 Remover niveles

8.0.1 Con índices

Estatura[3:5]
## [1] Alta Alta Baja
## Levels: Alta Baja Media

8.0.2 Con droplevels

droplevels(Estatura[3:5])
## [1] Alta Alta Baja
## Levels: Alta Baja

8.0.3 Con forcats :: fct_drop

#library(forcats)
fct_drop(Estatura[3:5], "Media")
## [1] Alta Alta Baja
## Levels: Alta Baja

9 Reordenar niveles

9.0.1 Con forcats :: fct_relevel

Letras <- factor(rep(c("a", "b", "c", "d"), each=2))

#library(forcats)
fct_relevel(Letras, "a", after=1)
## [1] a a b b c c d d
## Levels: b a c d
fct_relevel(Letras, "a", after=3)
## [1] a a b b c c d d
## Levels: b c d a
fct_relevel(Letras, "b", after=Inf)
## [1] a a b b c c d d
## Levels: a c d b

9.0.2 Reordenar niveles de grupo por estadísticas

Letras <- factor(rep(c("a", "b", "c", "d"), each=2))
Numero <- c(1:3, 2:5, 1)

tapply(Numero, Letras, FUN=mean)
##   a   b   c   d 
## 1.5 2.5 3.5 3.0
reorder(Letras, Numero, FUN=mean)
## [1] a a b b c c d d
## attr(,"scores")
##   a   b   c   d 
## 1.5 2.5 3.5 3.0 
## Levels: a b d c

10 Recodificar en data frames

10.0.1 El data frame

A <- 1:5;
B <- c("Masculino", "Femenino", "Masculino", "Masculino", "Femenino") 
C <- c(0, 1, 1, 0, 1)
D <- c("Mucho", "Poco", "Mucho", "Bastante", "Mucho")
E <- c("1", "2", "1", "2", "2")
datos <- data.frame(Posición = A, Genero = B, Salud = C,  Opinion = D, Fuma = E); datos
##   Posición    Genero Salud  Opinion Fuma
## 1        1 Masculino     0    Mucho    1
## 2        2  Femenino     1     Poco    2
## 3        3 Masculino     1    Mucho    1
## 4        4 Masculino     0 Bastante    2
## 5        5  Femenino     1    Mucho    2

Debemos especificar cuál es la variable a recodificar, cuáles son los criterios de recodificación y si deseamos que la nueva variable resultante de la recodificación sea un factor o no. Es importante reclacar que, en algunos casos, las recodificaciones tampoco afectarán al propio data.frame.

10.0.2 Recodificar con levels

df <- datos
df$Salud <- factor(df$Salud)
levels(df$Salud)[1] <- "Sano"
levels(df$Salud)[2] <- "Enfermo"
df
##   Posición    Genero   Salud  Opinion Fuma
## 1        1 Masculino    Sano    Mucho    1
## 2        2  Femenino Enfermo     Poco    2
## 3        3 Masculino Enfermo    Mucho    1
## 4        4 Masculino    Sano Bastante    2
## 5        5  Femenino Enfermo    Mucho    2

10.0.3 Recodificar con ifelse

df$Genero <- ifelse(df$Genero=="Masculino",1,0)
df
##   Posición Genero   Salud  Opinion Fuma
## 1        1      1    Sano    Mucho    1
## 2        2      0 Enfermo     Poco    2
## 3        3      1 Enfermo    Mucho    1
## 4        4      1    Sano Bastante    2
## 5        5      0 Enfermo    Mucho    2

10.0.4 Recodificar con dplyr :: revalue

#library(plyr)

df$Opinion <- revalue(df$Opinion,c("Poco"="1","Bastante"="2", "Mucho"="3"))
df
##   Posición Genero   Salud Opinion Fuma
## 1        1      1    Sano       3    1
## 2        2      0 Enfermo       1    2
## 3        3      1 Enfermo       3    1
## 4        4      1    Sano       2    2
## 5        5      0 Enfermo       3    2

10.0.5 Con car :: recode

df <- data.frame(edad=c(22,21,34,40), sexo=c("H","M","H","H")); df
##   edad sexo
## 1   22    H
## 2   21    M
## 3   34    H
## 4   40    H
#library(car)
edad_cod<-recode(df$edad, " 15:25='joven'; 26:65='adulto' "); edad_cod 
## [1] "joven"  "joven"  "adulto" "adulto"
sexo_cod<-recode(df$sexo, " 'H'=0 ; 'M'=1 "); sexo_cod 
## [1] 0 1 0 0
df
##   edad sexo
## 1   22    H
## 2   21    M
## 3   34    H
## 4   40    H

11 Recodificar y crear nuevas variables dentro del data frame

11.0.1 El data frame

A <- 1:5;
B <- c("Masculino", "Femenino", "Masculino", "Masculino", "Femenino") 
C <- c(0, 1, 1, 0, 1)
D <- c("Mucho", "Poco", "Mucho", "Bastante", "Mucho")
E <- E <- c("1", "2", "1", "2", "2")
datos <- data.frame(Posición = A, Genero = B, Salud = C,  Opinion = D, Fuma = E); datos
##   Posición    Genero Salud  Opinion Fuma
## 1        1 Masculino     0    Mucho    1
## 2        2  Femenino     1     Poco    2
## 3        3 Masculino     1    Mucho    1
## 4        4 Masculino     0 Bastante    2
## 5        5  Femenino     1    Mucho    2

11.0.2 Recodificar con ifelse

df <- datos
df$GenderMale <- ifelse(df$Genero=="Masculino",1,0)
df
##   Posición    Genero Salud  Opinion Fuma GenderMale
## 1        1 Masculino     0    Mucho    1          1
## 2        2  Femenino     1     Poco    2          0
## 3        3 Masculino     1    Mucho    1          1
## 4        4 Masculino     0 Bastante    2          1
## 5        5  Femenino     1    Mucho    2          0

11.0.3 Recodificar con plyr :: revalue

#library(plyr)

df$Opinion_cat <- revalue(df$Opinion,c("Poco"="1","Bastante"="2", "Mucho"="3"))
df$Fuma_cat <- revalue(df$Fuma,c("1"="Si","2"="No"))
df
##   Posición    Genero Salud  Opinion Fuma GenderMale Opinion_cat Fuma_cat
## 1        1 Masculino     0    Mucho    1          1           3       Si
## 2        2  Femenino     1     Poco    2          0           1       No
## 3        3 Masculino     1    Mucho    1          1           3       Si
## 4        4 Masculino     0 Bastante    2          1           2       No
## 5        5  Femenino     1    Mucho    2          0           3       No

12 Recodificar escala tipo Likert

12.0.1 El data frame

A <- c("Mucho", "Bastante", "Mucho", "Poco", "Poco")
B <- c("Mucho", "Poco", "Mucho", "Bastante", "Mucho")
C <- c( "Mucho", "Bastante", "Bastante", "Poco","Mucho")
D <- c( "Poco", "Bastante", "Mucho", "Mucho", "Mucho")
datos <- data.frame(A, B, C, D); datos
##          A        B        C        D
## 1    Mucho    Mucho    Mucho     Poco
## 2 Bastante     Poco Bastante Bastante
## 3    Mucho    Mucho Bastante    Mucho
## 4     Poco Bastante     Poco    Mucho
## 5     Poco    Mucho    Mucho    Mucho

12.0.2 De categórica a numérica

Nuevo <- data.frame(lapply(datos, factor, ordered=TRUE, 
                          levels=c("Poco","Bastante", "Mucho"), 
                          labels=c("1", "2", "3")))
Nuevo
##   A B C D
## 1 3 3 3 1
## 2 2 1 2 2
## 3 3 3 2 3
## 4 1 2 1 3
## 5 1 3 3 3

12.0.3 De numérica a categórica

df <- data.frame(lapply(Nuevo, factor, ordered=TRUE, 
                          levels=c("1","2", "3"), 
                          labels=c("Poco","Bastante", "Mucho")))
df
##          A        B        C        D
## 1    Mucho    Mucho    Mucho     Poco
## 2 Bastante     Poco Bastante Bastante
## 3    Mucho    Mucho Bastante    Mucho
## 4     Poco Bastante     Poco    Mucho
## 5     Poco    Mucho    Mucho    Mucho

13 Ejercicios

Crear un nuevo documento R Markdown, realizando las siguientes actividades. Crear variables y data frames y practicar los códigos explicados anteriormente.

Bibliografía

Consultar el documento RPubs :: Enlace y materiales de ayuda.

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.