Matrices vrs. Data Frames

Matrices

Anteriormente, aprendimos a instalar paquetes y a importar bases de datos. Las matrices por lo general sólo almacenan un tipo de datos mientras que las data frames puede almacenar varios tipos de datos.

m <-matrix(1:20, ncol=2)
m
##       [,1] [,2]
##  [1,]    1   11
##  [2,]    2   12
##  [3,]    3   13
##  [4,]    4   14
##  [5,]    5   15
##  [6,]    6   16
##  [7,]    7   17
##  [8,]    8   18
##  [9,]    9   19
## [10,]   10   20

En general, los datos de una matriz son numéricos. R es muy potente para hacer operaciones con matrices.

Para poder llegar a ver los elementos individuales de una matriz, tenemos que usar los corchetes y revisar por ejemplo el elemento 5 de la columna 1

m[5,1] 
## [1] 5
m[5,2]
## [1] 15
m[, 1] # si queremos todas las filas, no ponemos nada
##  [1]  1  2  3  4  5  6  7  8  9 10
m[1, ] # si queremos todas las columnas no ponemos nada
## [1]  1 11
m[1:2,]
##      [,1] [,2]
## [1,]    1   11
## [2,]    2   12
m[c(1,5, 6),]
##      [,1] [,2]
## [1,]    1   11
## [2,]    5   15
## [3,]    6   16
n<-m[1,]

class(m)
## [1] "matrix"
class(n)
## [1] "integer"

Estos resultados se pueden asignar también a nuevos objetos, lo cual es muy útil cuando estemos filtrando caso.

Dataframes

Para revisar los dataframes, vamos a volver a importar nuestro archivo de la ehpm2017. [Recuerda haber limpiado tu ambiente y establecido el directorio de trabajo]

library(haven)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(sjlabelled)
## 
## Attaching package: 'sjlabelled'
## The following object is masked from 'package:dplyr':
## 
##     as_label
## The following objects are masked from 'package:haven':
## 
##     as_factor, read_sas, read_spss, read_stata, write_sas,
##     zap_labels
ehpm2017 <- read_dta("./datos/ehpm2017.dta", encoding = "latin1") # ponemos esto por si hay caracteres raros

Ojeando

#glimpse(ehpm2017)
glimpse(ehpm2017[,1:10]) # en corchete del lado derecho podemos ojear columnas 
## Observations: 75,133
## Variables: 10
## $ edicion  <dbl> 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2017, 2…
## $ lote     <dbl> 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,…
## $ tipo     <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ folio    <dbl> 36, 36, 36, 36, 36, 37, 38, 38, 38, 38, 38, 38, 38, 39,…
## $ viv      <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ r101     <dbl> 1, 2, 3, 4, 5, 1, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 1, 2…
## $ idboleta <dbl> 163037, 163037, 163037, 163037, 163037, 163038, 163039,…
## $ fac00    <dbl> 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, …
## $ area     <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ region   <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …

La “r” viene de reactivos. Corresponden a la boleta. Es muy bueno siempre tener la boleta a la mano http://www.digestyc.gob.sv/index.php/temas/des/ehpm/publicaciones-ehpm.html?download=652%3Apublicacion-ehpm-2017 (hasta el final)

Podemos hacer un tipo “labelbook”, usando una función que viene de la librería “sjlabelled”, “get_labels”. Funciona para toda la base o para columnas, o para variables.

#print(get_labels(ehpm2017)) #todas
print(get_labels(ehpm2017[, 1:10])) #de las primeras 10 variables
## $edicion
## NULL
## 
## $lote
## NULL
## 
## $tipo
## [1] "Hogar principal" "Doble hogar"     "Doble hogar"     "Doble hogar"    
## 
## $folio
## NULL
## 
## $viv
## [1] "Vivienda en muestra" "Vivienda extra"     
## 
## $r101
## NULL
## 
## $idboleta
## NULL
## 
## $fac00
## NULL
## 
## $area
## [1] "Rural"  "Urbano"
## 
## $region
## [1] "Occidental"                        
## [2] "Central I"                         
## [3] "Central II"                        
## [4] "Oriental"                          
## [5] "Área metropolitana de San Salvador"
print(get_labels(ehpm2017$actpr)) #
## [1] "Ocupado"            "Desocupado abierto" "Desocupado oculto" 
## [4] "Desocupado oculto"  "Desocupado oculto"  "Desocupado oculto" 
## [7] "Inactivo"

Selección de casos y de variables

Poco a poco vamos comprendiendo más la lógica de R. Hay varias “formas” de programar. Por lo que no te asustes si varios códigos llegan al mismo resultado

Para revisar el contenido de un data frame podemos usar, como lo hicimos anteriormente, el formato basededatos$var o usar corchete, checa como estas cuatro formas tan el mismo resultado.

x<-ehpm2017$region
x<-ehpm2017[["region"]]  # ¡Ojo con las comillas! 
x<-ehpm2017[,10]
x<-ehpm2017[,"region"]

Ahora, con el formato de dplyr podemos llegar a lo mismo

x<-ehpm2017 %>% 
  select(region)

Selección “inversa”

O sea no “botar algo”, es con el negativo. No funciona con todos los formatos

x<-ehpm2017 %>% 
  select(-region)
x<-ehpm2017[,-10]

rm(x) #rm sólo bota objetos

Pero con los otros formatos podemos “asignar” valores adentro de un data.frame, y uno de eso valores puede ser la nada

ehpm2017$region2<-ehpm2017$region
ehpm2017$region2<-NULL

De aquí viene esa cuesta en el aprendizaje; tenemos que comprender en qué forma programó el que hizo la librería e incluso a veces cómo aprendió quién te está enseñando o el foro que estás leyendo.

Vamos a pedir cosas más específicas y podemos seleccionar observaciones o filas. Como nuestra base de datos es muy grande, guardaremos el filtro o selección en un objeto

subset1<-ehpm2017[ehpm2017$region==5,]

También podemos seleccionar columnas

subset2<- ehpm2017[, c("idboleta", "r101", "money")]

podemos combinar los dos tipos de selección

subset3<- ehpm2017[(ehpm2017$region==5 & ehpm2017$r104==1 ), c("idboleta", "r101", "money")]

Con dplyr, podemos usar “filter” y “select”

subset4<-ehpm2017 %>% 
  filter(region==5 , r104==1) %>%
    select(idboleta,r101, money)

Gráficos y frecuencias

Vamos a revisar cuántas personas están en cada región de residencia. Si recuerdas, eso se puede hacer con el comando table. Como estamos trabajando

table(ehpm2017$region)
## 
##     1     2     3     4     5 
## 17616 16572 12849 17802 10294

E incluso podemos llamar las etiquetas:

table(as_label(ehpm2017$region))
## 
##                         Occidental                          Central I 
##                              17616                              16572 
##                         Central II                           Oriental 
##                              12849                              17802 
## Área metropolitana de San Salvador 
##                              10294

Este resultado lo podemos asignar a un objeto nuevo

freq.region<-table(as_label(ehpm2017$region))

El tenerlo como un objeto nos sirve sobre todo porque podemos aplicarle funciones a esta tabla de frecuencias, las funciones m´ás importantes que podemos aplicar son las gráficas

plot(freq.region) # el gráfico más sencillo 

barplot(freq.region) # gráficos de barra

pie(freq.region) # gráfico de pastel

Vamos a modificar ligeramente los colores

barplot(freq.region, col=gray(0:5/5)) # gráficos de barra con escala de grises de oscuro a claros, (8 categorías)

barplot(freq.region, col=gray(5:0/5)) # gráficos de barra con escala de grises de claro a oscuros

barplot(freq.region, col=rainbow(5)) # gráfico de barras () ponemos el número de categorías

barplot(freq.region, col=heat.colors(5)) # gráfico de barras () ponemos el número de categorías

También podemos hacer nuestro propio vector de colores, para la paleta de nombres de colores que usa R, revisar http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf

my_colors1<-c("lightblue","lightblue1", "lightblue2", "lightblue3", "lightblue4")

my_colors2<-c("mediumorchid","mediumorchid1", "mediumorchid2", "mediumorchid3", "mediumorchid4")

barplot(freq.region, col=my_colors1) # gráficos de barra con colores personalizados 1

barplot(freq.region, col=my_colors2) # gráficos de barra con colores personalizados 2

Para poner título

barplot(freq.region, col=gray.colors(8)) 
title(main = list("Regiones de residencia", font = 4))

# border :
barplot(freq.region, border = "dark blue", col=my_colors2,  legend = rownames(freq.region))

Para hacer las barras horizontales le ponemos la opción “horiz=TRUE”

barplot(freq.region, border = "dark blue", col=my_colors2,  legend = rownames(freq.region), horiz=TRUE )

Gráficos bivariados

Vamos a combinar nuestra variable de región con nuestra variable de sexo “r104”

freq.reg.sex<-table(as_label(ehpm2017$region), as_label(ehpm2017$r104))
freq.reg.sex
##                                     
##                                      Hombre Mujer
##   Occidental                           8450  9166
##   Central I                            7854  8718
##   Central II                           6065  6784
##   Oriental                             8405  9397
##   Área metropolitana de San Salvador   4764  5530

Con este objeto vamos a graficar.

Para barras apiladas

barplot(freq.reg.sex, main="Población según región y sexo",
                   col=heat.colors(5),
                      legend = rownames(freq.reg.sex))

Para barras agrupadas Para estos gráficos usamos el mismo código, pero le activamos la opción “beside”

barplot(freq.reg.sex,  main="Población según región y sexo",
                   col=heat.colors(5),
                     legend = rownames(freq.reg.sex),
                   beside=TRUE )

Para las barras apiladas es útil que lo veamos en términos de proporciones.

Para eso usabmos “prop.table” la opción 1, es para que nos dé las proporciones por fila la opción 2, es para que nos dé las proporciones por columna Sin opción, da la proporción para el total de observaciones

prop.reg.sex<-prop.table(freq.reg.sex,2)
prop.reg.sex
##                                     
##                                         Hombre     Mujer
##   Occidental                         0.2377737 0.2314939
##   Central I                          0.2210029 0.2201793
##   Central II                         0.1706624 0.1713348
##   Oriental                           0.2365074 0.2373279
##   Área metropolitana de San Salvador 0.1340537 0.1396641
barplot(prop.reg.sex, main="Población según región y sexo",
                   col=heat.colors(5),
                      legend = rownames(prop.reg.sex))

Ambiente

¿Y tenemos que volver a hacer todo de nuevo? Nos podemos ahorrar mucho guardando nuestro ambiente.Los ambientes son los archivos de datos de R. Su extensión es “.RData”. Y podemos guardar nuestro script. El script tiene un extensión “.R”

save.image("./datos/ambiente_p3.RData")

Ejercicio

Para todos los siguientes incisos, utilice colores de acuerdo a su selección en un vector:

  1. Haga un gráfico de barras verticales de “parentesco”

    1. Haga un gráfico de barras horizontes de “actpr2012”

      1. Haga un gráfico de barras apiladas de “parentesco” vrs “actpr2012”, pero primero haga un filtro donde deje sólo a la población de 15 años y más.

Mandar el código a la siguiente liga:

https://tinyurl.com/Ej3-ESA-R