Administrar datos en R

En esta presentación examinaremos los siguientes temas:

Cargar datos en R

Para seguir los procedimientos mostrados en esta presentación, primero deberá descagar y descomprimir el archivo r_import.zip que encontrará en el siguiente enlace web:

https://sites.google.com/a/pucp.pe/data_est/archivos

Deberá guardar y descomprimir el contenido del archivo zip en su directorio de trabajo de R especificado al iniciar su sesión.

Si logró con éxito descomprimir los archivos contenidos en el enlace anterior, en su directorio de trabajo deberá encontrar los siguientes archivos:

Estos son algunos de los formatos más usuales para guardar bases de datos con las cuales podemos realizar algunos análisis estadísticos. En las siguientes diapositivas les mostraremos cómo cargar datos desde estos formatos.

Cargar datos en formato R

Si tuvo éxito en el paso anterior, podrá cargar los datos en formato R usando el siguiente comando (recuerde que los archivos deben estar guardados en su directorio de trabajo, de lo contrario deberá especificar la ruta completa del archivo en su disco duro):

load("genero.rda")

Con ese comando usted está cargando un data frame en R que contiene la base de datos llamada “genero”.

Explorar el contenido de la base de datos “genero”

Para explorar el contenido del archivo género puede usar:

head(genero)
##   NRO      SEXO EDAD edideal_muj edideal_hom     DOMINIO NSEGrup
## 1   1  Femenino   55          25          30 Lima-Callao     A/B
## 2   2 Masculino   62          26          30 Lima-Callao     A/B
## 3   3  Femenino   70          28          30 Lima-Callao     A/B
## 4   4  Femenino   20          30          35 Lima-Callao     A/B
## 5   5  Femenino   18          25          30 Lima-Callao     A/B
## 6   6 Masculino   25          25          30 Lima-Callao       C

Ello le muestra los seis primeros registros o casos de la base de datos o data frame.

Podemos ver el contenido la base de datos utilizando el comando:

str(genero)
## 'data.frame':    1203 obs. of  7 variables:
##  $ NRO        : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ SEXO       : Factor w/ 2 levels "Masculino","Femenino": 2 1 2 2 2 1 1 1 1 2 ...
##  $ EDAD       : num  55 62 70 20 18 25 46 38 52 53 ...
##  $ edideal_muj: num  25 26 28 30 25 25 30 35 25 26 ...
##  $ edideal_hom: num  30 30 30 35 30 30 35 38 25 28 ...
##  $ DOMINIO    : Factor w/ 5 levels "Lima-Callao",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ NSEGrup    : Factor w/ 3 levels "A/B","C","D/E": 1 1 1 1 1 2 3 2 2 2 ...

Para más detalles sobre esta base de datos pueden acceder a la información completa a través del portal IOP-Data:

http://iop-data.pucp.edu.pe/busqueda/encuesta/71?

Las variables de la base de datos “genero” son:

  • NRO: Número o ID del entrevistado
  • SEXO: Sexo del entrevistado
  • EDAD: Edad del entrevistado
  • edideal_muj: Edad ideal para que una mujer se case
  • edideal_hom: Edad ideal para que un hombre se case
  • DOMINIO: Dominio geográfico de estudio
  • NSEGrup: Nivel socioeconómico del hogar del entrevistado (agrupado)

Cargar datos en otros formatos: Excel

Para importar una base de datos en Excel, lo más recomendable es guardar el archivo Excel en un formato delimitado por comas (csv).

Entre los archivos que se les pidió descomprimir, hay una version de la base de datos en Excel (genero.xls). Abra ese archivo en Excel y pida la opción “Guardar como” y seleccione como tipo de archivo “CSV (delimitado por comas)”.

Al usar esta opción es importante tomar en cuenta cuál es el separador de decimales que está utilizando en su computadora. El formato estándar es usar el punto como separador de decimales, pero algunas personas prefieren usar las comas como separador de decimales. En este último caso, la conversión de Excel a CSV puede variar. En este ejemplo, estamos suponiendo que el estándar utilizado es la separación de decimales con el punto y que el sistema operativo empleado es el Windows.

Cargar archivos en otros formatos: CSV

El formato de archivo separado por comas es un estándar bastante difundido. Guarda las bases de datos en archivos donde en cada fila se almacena la información de un casos y los campos o variables están separados por comas. Estos archivos pueden leerse desde cualquier editor de textos.

Entre los archivos descomprimidos usted econtrará uno llamado “genero.csv”. Para cargar el archivo al R deberá utilizar el siguiente comando:

genero2 <- read.csv("genero.csv")

Esto almacenará la base de datos en un objeto de R tipo data frame llamado “genero2”. Le hemos puesto el sufijo “2” para diferenciarlo de “genero creado previamente”. Puede usar los comandos head(genero2) o names(genero2) para explorar el contenido de este data frame.

Cargar archivos en otros formatos: SPSS

Para importar un archivo de SPSS primero debemos cargar el paquete “foreign”. Los paquetes en R son programas especiales de R que contienen funciones especificas, en este caso el paquete “foreign” sirve para importar datos en diveros formatos.

Los paquetes del R se almacenan en lo que se llama la “librería” (library) de R. El programa de base de R vienen con un conjunto de paquetes pre-instalados (entre ellos el “foreign”), sin embargo en algunos casos es necesario descargar un paquede desde un CRAN e instalarlo en el R. Para mayor información sobre cómo instalar paquetes en R recomendamos revisar el siguiente link:

http://www.statmethods.net/interface/packages.html

Vamos a importar el archivo “genero.sav” y guardarlo en un objeto tipo data frame que se llame “genero3”:

library(foreign)
genero3 <- as.data.frame(read.spss("genero.sav"))
## Warning in read.spss("genero.sav"): genero.sav: Unrecognized record type
## 7, subtype 18 encountered in system file
## Warning in read.spss("genero.sav"): genero.sav: Unrecognized record type
## 7, subtype 24 encountered in system file
## re-encoding from latin1

Comparar datos importados

head(genero, 2) # Base de datos en formato R
##   NRO      SEXO EDAD edideal_muj edideal_hom     DOMINIO NSEGrup
## 1   1  Femenino   55          25          30 Lima-Callao     A/B
## 2   2 Masculino   62          26          30 Lima-Callao     A/B
head(genero2, 2) # Base de datos importada desde csv
##   NRO SEXO EDAD edideal_muj edideal_hom DOMINIO NSEGrup
## 1   1    2   55          25          30       1       1
## 2   2    1   62          26          30       1       1
head(genero3, 2) # Base de datos importada desde spss
##   NRO      SEXO EDAD edideal_muj edideal_hom     DOMINIO NSEGrup
## 1   1  Femenino   55          25          30 Lima-Callao     A/B
## 2   2 Masculino   62          26          30 Lima-Callao     A/B

Invocar una variable específica

Para invocar una variable específica de un data frame debemos usar la expresión: dataframe$variable. Por ejemplo :

str(genero$DOMINIO)
##  Factor w/ 5 levels "Lima-Callao",..: 1 1 1 1 1 1 1 1 1 1 ...
class(genero2$DOMINIO)
## [1] "integer"

Ojo que el R sí diferencia entre mayúsculas y minúsculas.

Convertir un vector en factor

Vamos a convertir la variable “SEXO” del data frame “genero2” en un factor con su correspondientes etiquetas. Nótese que las etiquetas (labels) deben especificarse en el orden que corresponden a sus códigos.

genero2$SEXO <- factor(genero2$SEXO, labels=c("Femenino", "Masculino"))
str(genero2$SEXO)
##  Factor w/ 2 levels "Femenino","Masculino": 2 1 2 2 2 1 1 1 1 2 ...

Sigamos conviertiendo las demás variables categóricas del data frame “genero2” en factores con sus respectivas etiquetas:

genero2$DOMINIO <- factor(genero2$DOMINIO, 
                          labels=c("Lima-Callao", "Norte", "Sur", 
                                   "Centro", "Oriente"))
genero2$NSEGrup <- factor(genero2$NSEGrup, 
                          labels=c("A/B", "C", "D/E"))
head(genero2)
##   NRO      SEXO EDAD edideal_muj edideal_hom     DOMINIO NSEGrup
## 1   1 Masculino   55          25          30 Lima-Callao     A/B
## 2   2  Femenino   62          26          30 Lima-Callao     A/B
## 3   3 Masculino   70          28          30 Lima-Callao     A/B
## 4   4 Masculino   20          30          35 Lima-Callao     A/B
## 5   5 Masculino   18          25          30 Lima-Callao     A/B
## 6   6  Femenino   25          25          30 Lima-Callao       C

Manipular datos en R

Valores perdidos (1)

Cuando se registran datos en una investigación es posible que no se logre obtener la información de algunas variables para determinados casos. En las encuestas ello suele suceder cuando el entrevistado no quiere o no sabe responder una pregunta (los “no sabe / no responde”).

En muchos casos se suele excluir este tipo de respuestas del análisis, registrándolas como “valores perdidos”

En el caso de la base de datos de “genero” que estamos usando, si revisan el cuestionario en IOP-Data, notarán que para la pregunta “Edad ideal para que una mujer se case”, el código “99” identifica a las respuestas del tipo “No sabe / No responde”. Al pedir una tabla de frecuencias de esta variable, podemos notar que hay 42 casos que tienen como respuesta el código “99”.

table(genero$edideal_muj)
## 
##  15  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34 
##   1  12   3 101   6  37  31  40 393  72  71 101  22 207   1  12   7   1 
##  35  36  38  40  60  99 
##  34   3   1   4   1  42

En el R, el código para valores perdidos es “NA”. En el caso de la variable de edad ideal para que una mujer se case, podemos indicar que el valor “99” es un valor perdido de la siguiente manera:

genero$edideal_muj[genero$edideal_muj==99] <- NA
table(genero$edideal_muj)
## 
##  15  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34 
##   1  12   3 101   6  37  31  40 393  72  71 101  22 207   1  12   7   1 
##  35  36  38  40  60 
##  34   3   1   4   1

Nótese que al pedir la tabla de frecuencias de la variable, ya no aparecen los casos que son “NA”.

Podemos saber cuántos valores perdidos tiene una variable creando un vector lógico que idenfique a los valores perdidos:

perdidos.v1 <- is.na(genero$edideal_muj)
table(perdidos.v1)
## perdidos.v1
## FALSE  TRUE 
##  1161    42
# También podemos hacerlo de la siguiente manera:
table(is.na(genero$edideal_muj))
## 
## FALSE  TRUE 
##  1161    42

Hay 42 casos perdidos para la variable edideal_muj

Seleccionar o identificar casos y variables en un data frame

Si queremos seleccionar o identificar un grupo de casos de un data frame, una alternativa es la siguiente:

Ejemplo 1: Los datos del tercer registro de la base de datos genero

genero[3, ]
##   NRO     SEXO EDAD edideal_muj edideal_hom     DOMINIO NSEGrup
## 3   3 Femenino   70          28          30 Lima-Callao     A/B

Ejemplo 2: Los seis primeros registros de la tercera variable de la base de datos:

head(genero[, 3])
## [1] 55 62 70 20 18 25

Ejemplo 3: El genero del 10º registro de la base de datos:

genero[10, 2]
## [1] Femenino
## Levels: Masculino Femenino

Podemos guardar el resultado de una selecciónn en un nuevo objeto, por ejemplo si queremos seleccionar todos los registros pero sólo de la variable edad, podemos:

edad <- genero[, 3]
head(edad)
## [1] 55 62 70 20 18 25

Recodificar variables

Vamos a recodificar la variable DOMINIO de la base de datos género en una nueva variable que tenga dos categorías: “Lima y Callao” y “Provincia”

class(genero$DOMINIO)
## [1] "factor"
levels(genero$DOMINIO)
## [1] "Lima-Callao" "Norte"       "Sur"         "Centro"      "Oriente"

Para ello, primero vamos a convertir la variable dominio en un vector numérico temporal

dominio.t <- as.numeric(genero$DOMINIO)

Luego, crearemos un vector vacío donde vamos a recodificar los valores correspondientes a los códigos originales de la variable dominio. El nuevo vector será luego transformado en un factor.

dominio2 <- vector() # Se crea un vector vacío
dominio2[dominio.t == 1] <- "Lima y Callao"
dominio2[dominio.t > 1] <- "Provincia"
dominio2 <- as.factor(dominio2)

Finalmente, integraremos la nueva variable recodificada en el data frame

genero$dominio2 <- dominio2
table(genero$DOMINIO)
## 
## Lima-Callao       Norte         Sur      Centro     Oriente 
##         448         320         245         105          85
table(genero$dominio2)
## 
## Lima y Callao     Provincia 
##           448           755

Otra manera de recodificar la misma variable con los mismos resultados es la siguiente:

dominio.t2 <- as.numeric(genero$DOMINIO)
dominio3<- ifelse(dominio.t2 > 1, c("Provincia"), c("Lima y Callao"))
table(dominio3)
## dominio3
## Lima y Callao     Provincia 
##           448           755

Recodificar vectores numéricos en factores

Podemos convertir vectores numéricos en factores para agrupar los valores de una variable cuantitativa en intervalos de clase categóricos, por ejemplo, grupos de edad.

gedad <- vector()
gedad[genero$EDAD < 25] <- 1
gedad[genero$EDAD >= 25 & genero$EDAD < 35] <- 2
gedad[genero$EDAD >= 35 & genero$EDAD < 45] <- 3
gedad[genero$EDAD >= 45] <- 4
genero$gedad <- as.factor(gedad)
levels(genero$gedad) <- c("18 a 24", "25 a 34", "35 a 44", "45 a más")
table(genero$gedad)
## 
##  18 a 24  25 a 34  35 a 44 45 a más 
##      256      284      255      408

Otra forma de hacerlo es usando el comando “cut” para establecer puntos de corte para los intervalos

gedad2 <- cut(genero$EDAD, breaks=c(17, 24, 34, 44, 100), 
              include.lowest=TRUE)
table(gedad2)
## gedad2
##  [17,24]  (24,34]  (34,44] (44,100] 
##      256      284      255      408
table(genero$gedad)
## 
##  18 a 24  25 a 34  35 a 44 45 a más 
##      256      284      255      408

Para mayores detalles sobre el comando “cut” puede solicitar la ayuda correspondiente mediante:

help(cut)

Calcular nuevas variables

En el R es simple calcular una nueva variable. Por ejemplo, queremos ver si para los entrevistados, la edad ideal para que un hombre se case es mayor o menor que la edad ideal para que una mujer se case. Esto puede hacerse de la siguiente manera:

dif.idealH_M <- genero$edideal_hom - genero$edideal_muj

En este caso la variable dif-idealH-M mide la diferencia entre la edad ideal para casarse de un hombre y de una mujer. Si el número es positivo, significa que el entrevistado opina que la edad ideal para que un hombre se case debe ser mayor que la de la mujer. Si el número es negativo, siginifica lo inverso.