Gestión de datos con R

Francisco García García (2014-12-16)


0. Introducción

1. Ordenación

2. Filtrado

3. Recodificación de variables

4. Transformación de variables

5. Categorizar una variable cuantitativa en una cualitativa

6. Ejercicios

7. Enlaces de interés





0. Introducción

R nos permite realizar operaciones de gestión de datos como son la ordenación, la selección o exclusión de grupos de registros o variables, recodificación de variables, transformación de variables, categorización de variables cuantitativas en categóricas….

A continuación se detalla cada una de estas acciones.

1. Ordenación

Comenzamos leyendo la base de datos riesgos sobre la que realizaremos diversas gestiones de manejo de datos:

datos <- read.csv("riesgos.csv", header = T, sep = "\t")

Echamos un vistazo a la estructura de los datos:

str(datos)
#> 'data.frame':    91 obs. of  10 variables:
#>  $ id        : int  2 3 6 7 8 10 11 12 14 15 ...
#>  $ contrato  : int  3 1 5 1 3 2 1 3 1 1 ...
#>  $ jornada   : Factor w/ 2 levels "completa","parcial": 1 1 1 1 1 1 1 1 1 1 ...
#>  $ turno     : int  1 1 1 1 1 1 1 1 3 1 ...
#>  $ carfisi   : Factor w/ 2 levels "no","sí": 1 1 2 2 2 1 1 1 1 1 ...
#>  $ carpsiqui : Factor w/ 2 levels "no","sí": 1 1 1 1 1 2 1 1 2 2 ...
#>  $ expquímica: Factor w/ 2 levels "no","sí": 1 1 1 1 2 1 1 1 1 1 ...
#>  $ edad      : int  33 37 35 30 30 32 27 33 31 31 ...
#>  $ peso      : num  74 74 67 57 69 56 74 76 65 NA ...
#>  $ talla     : num  155 170 170 164 160 160 170 165 170 173 ...
head(datos)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160
tail(datos)
#>    id contrato jornada turno carfisi carpsiqui expquímica edad peso talla
#> 86 73        5 parcial     1      no        no         no   32   65   159
#> 87 75        1 parcial     1      no        no         no   33   87   185
#> 88 76        1 parcial     1      sí        no         no   30   76   178
#> 89 80        4 parcial     1      no        no         no   29   65   153
#> 90 82        1 parcial     1      no        no         no   35   78   190
#> 91 86        4 parcial     4      no        no         no   28   65   167

Con la función attach hacemos accesible la base de datos seleccionada:

attach(datos)
#> The following objects are masked from datos (position 3):
#> 
#>     carfisi, carpsiqui, contrato, edad, expquímica, id, jornada,
#>     peso, talla, turno
#> The following objects are masked from datos (position 9):
#> 
#>     carfisi, carpsiqui, contrato, edad, expquímica, id, jornada,
#>     peso, talla, turno

Ordenamos los datos por la variable edad y guardamos esta nueva información en datos2:

datos2 <- datos[order(edad), ]
head(datos2)
#>    id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 57 78        1 completa     1      no        no         no   23   62   155
#> 15 20        1 completa     1      sí        sí         no   25   NA   175
#> 76 30        2  parcial     1      no        no         no   25   65   153
#> 31 44        4 completa     1      sí        no         no   26   56   150
#> 35 50        1 completa     1      no        sí         no   26   68   172
#> 44 61        2 completa     1      no        sí         no   26   96   175

Ordenamos los datos por la variable edad en sentido decreciente y guardamos esta nueva información en datos2:

datos2 <- datos[order(-edad), ]
head(datos2)
#>    id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 11 16        3 completa     1      no        sí         no   39   75   158
#> 32 46        3 completa     1      no        no         no   39   54   160
#> 79 39        4  parcial     4      no        no         no   39   69   175
#> 21 28        1 completa     1      no        sí         no   38   62   155
#> 2   3        1 completa     1      no        no         no   37   74   170
#> 25 36        1 completa     1      sí        sí         no   37   65   167

Ordenamos los datos: primero por la variable edad en sentido decreciente y en segundo lugar por la variable peso en sentido creciente y guardamos esta nueva información en datos2:

datos2 <- datos[order(-edad,peso), ]
head(datos2)
#>    id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 32 46        3 completa     1      no        no         no   39   54   160
#> 79 39        4  parcial     4      no        no         no   39   69   175
#> 11 16        3 completa     1      no        sí         no   39   75   158
#> 21 28        1 completa     1      no        sí         no   38   62   155
#> 28 40        1 completa     1      no        sí         no   37   54   165
#> 25 36        1 completa     1      sí        sí         no   37   65   167



2. Filtrado

En ocasiones necesitamos seleccionar un determinado grupo de variables o un determinado grupo de registros. O ambas cosas a la vez. ¿Cómo realizamos este filtrado desde R? Vemos algunos ejemplos con la base de datos riesgos.csv:

head(datos) 
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160

Seleccionamos las variables id, contrato y carfisi (son columnas en la base de datos). Guardamos la nueva información en datos2:

datos2 <- datos[, c("id", "contrato", "carfisi")]
head(datos2)
#>   id contrato carfisi
#> 1  2        3      no
#> 2  3        1      no
#> 3  6        5      sí
#> 4  7        1      sí
#> 5  8        3      sí
#> 6 10        2      no

Ahora seleccionamos los 3 primeros registros de la base riesgos y los guardaremos en datos2:

datos2 <- datos[1:3, ]
head(datos2)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170

También podemos seleccionar registros (filas en la base de datos) que verifiquen algún criterio de selección. Por ejemplo, estamos interesamos en realizar una subselección de la base de datos riesgos que incluya sólo personas con jornada completa:

datos2 <- datos[jornada=="completa",  ] 
head(datos2)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160
table(datos2$jornada)
#> 
#> completa  parcial 
#>       67        0

Por último queremos realizar la siguiente subselección: sólo nos quedaremos con las variables id, contrato y carfisi (columnas). Al mismo tiempo, seleccionaremos los registros con jornada completa (filas):

datos2 <- datos[jornada=="completa", c("id", "contrato", "carfisi")]
head(datos2)
#>   id contrato carfisi
#> 1  2        3      no
#> 2  3        1      no
#> 3  6        5      sí
#> 4  7        1      sí
#> 5  8        3      sí
#> 6 10        2      no



3. Recodificación de variables

Hay varias situaciones en las que nos interesará la recodificación de las variables:

3.1. Recodificamos los valores de una variable por otros valores en esa misma variable. Ejemplo: queremos cambiar los valores de la talla > 165 por 180:

talla
#>  [1] 155 170 170 164 160 160 170 165 170 173 158 165 161 168 175 168 165
#> [18] 159 185 153 155 170 172 160 167 179 160 165 170 170 150 160 150 180
#> [35] 172 165 170 150 168 170 165 162 170 175 170 170 175 164 164 165 175
#> [52] 165 168 165 150 153 155 168 159 170 172 160 179 160 175 165 160 176
#> [69] 160 165 177 173 150 178 168 153 159 190 175 160 167 159 175 164 160
#> [86] 159 185 178 153 190 167
talla[talla > 165] <- 200 
talla
#>  [1] 155 200 200 164 160 160 200 165 200 200 158 165 161 200 200 200 165
#> [18] 159 200 153 155 200 200 160 200 200 160 165 200 200 150 160 150 200
#> [35] 200 165 200 150 200 200 165 162 200 200 200 200 200 164 164 165 200
#> [52] 165 200 165 150 153 155 200 159 200 200 160 200 160 200 165 160 200
#> [69] 160 165 200 200 150 200 200 153 159 200 200 160 200 159 200 164 160
#> [86] 159 200 200 153 200 200

3.2. O bien realizamos una recodificación de valores pero en otra variable distinta de la inicial:

peso2 <- peso
peso2[peso > 75] <- 99 
peso
#>  [1] 74 74 67 57 69 56 74 76 65 NA 75 65 57 76 NA 68 78 65 87 59 62 76 93
#> [24] 64 65 87 54 54 75 76 56 54 70 70 68 88 90 65 58 65 88 89 60 96 90 60
#> [47] 60 54 85 69 70 52 68 78 57 59 62 76 78 76 93 64 87 54 69 54 67 98 67
#> [70] 87 76 83 57 76 76 65 78 78 69 67 75 50 69 56 50 65 87 76 65 78 65
peso2
#>  [1] 74 74 67 57 69 56 74 99 65 NA 75 65 57 99 NA 68 99 65 99 59 62 99 99
#> [24] 64 65 99 54 54 75 99 56 54 70 70 68 99 99 65 58 65 99 99 60 99 99 60
#> [47] 60 54 99 69 70 52 68 99 57 59 62 99 99 99 99 64 99 54 69 54 67 99 67
#> [70] 99 99 99 57 99 99 65 99 99 69 67 75 50 69 56 50 65 99 99 65 99 65



4. Transformación de variables

¿Cómo podemos incorporar nuevas variables en nuestra base de datos? Veamos algunos ejemplos:

Queremos crear una variable en la base de datos riesgos.csv que se llame índice de masa corporal que se obtiene dividiendo el peso en kg. entre el cuadrado de la altura en metros. Veamos como lo hacemos en R:

datos[, "IMC"]  <- peso / (talla/100)^2
head(datos)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160
#>        IMC
#> 1 30.80125
#> 2 18.50000
#> 3 16.75000
#> 4 21.19274
#> 5 26.95312
#> 6 21.87500



5. Categorizar una variable cuantitativa en una cualitativa

Esta opción suele ser muy habitual. Disponemos de la información detallada para una variable pero en ocasiones nos interesa trabajar con esta variable en su versión categórica.

Por ejemplo, categorizaremos la variable cuantitativa IMC en cuatro grupos:

summary(datos[,"IMC"])
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#>   14.50   19.00   21.75   22.45   25.71   33.91       2
datos[,"IMC_grupos"] <- cut(datos$IMC, breaks = c(14,18.5,25,30,34), labels = c("bajo peso", "normal", "sobrepreso", "obesidad"))
head(datos)
#>   id contrato  jornada turno carfisi carpsiqui expquímica edad peso talla
#> 1  2        3 completa     1      no        no         no   33   74   155
#> 2  3        1 completa     1      no        no         no   37   74   170
#> 3  6        5 completa     1      sí        no         no   35   67   170
#> 4  7        1 completa     1      sí        no         no   30   57   164
#> 5  8        3 completa     1      sí        no         sí   30   69   160
#> 6 10        2 completa     1      no        sí         no   32   56   160
#>        IMC IMC_grupos
#> 1 30.80125   obesidad
#> 2 18.50000  bajo peso
#> 3 16.75000  bajo peso
#> 4 21.19274     normal
#> 5 26.95312 sobrepreso
#> 6 21.87500     normal

¿Cuántas personas tenemos en cada uno de las categorías de IMC?

table(datos[,"IMC_grupos"])
#> 
#>  bajo peso     normal sobrepreso   obesidad 
#>         19         41         19         10



6. Ejercicios

En la base de datos estres.csv se incluye información sobre los niveles de estrés de un grupo de trabajadores, así como otras variables de interés.

Realiza las siguientes actividades en R:

7. Enlaces de interés