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 SDEMT219. [Recuerda haber limpiado tu ambiente y establecido el directorio de trabajo]

setwd("~/Dropbox/FCPyS-2020-i/EAIII/Prácticas_R")
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
SDEMT219 <- read_dta("SDEMT219.dta", encoding = "latin1") # ponemos esto por si hay caracteres raros

Ojeando

#glimpse(SDEMT219)
glimpse(SDEMT219[,1:10]) # en corchete del lado derecho podemos ojear columnas 
## Observations: 407,431
## Variables: 10
## $ r_def <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ loc   <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ mun   <dbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, …
## $ est   <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 30…
## $ est_d <dbl> 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117…
## $ ageb  <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ t_loc <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ cd_a  <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ ent   <dbl+lbl> 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, …
## $ con   <dbl> 40001, 40001, 40001, 40001, 40001, 40001, 40001, 40001, 40…

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(SDEMT219)) #todas
print(get_labels(SDEMT219[, 1:10])) #de las primeras 10 variables
## $r_def
## [1] "Entrevista completa"   "Entrevista suspendida"
## 
## $loc
## NULL
## 
## $mun
## NULL
## 
## $est
## NULL
## 
## $est_d
## NULL
## 
## $ageb
## NULL
## 
## $t_loc
## [1] "Localidades mayores de 100 000 habitantes"
## [2] "Localidades de 15 000 a 99 999 habitantes"
## [3] "Localidades de 2 500 a 14 999 habitantes" 
## [4] "Localidades menores de 2 500 habitantes"  
## 
## $cd_a
##  [1] "México"                    "Guadalajara"              
##  [3] "Monterrey"                 "Puebla"                   
##  [5] "León"                      "Torreón"                  
##  [7] "San Luis Potosí"           "Mérida"                   
##  [9] "Chihuahua"                 "Tampico"                  
## [11] "Veracruz"                  "Acapulco"                 
## [13] "Aguascalientes"            "Morelia"                  
## [15] "Toluca"                    "Saltillo"                 
## [17] "Villahermosa"              "Tuxtla Guutiérrez"        
## [19] "Cd. Juárez"                "Tijuana"                  
## [21] "Culiacán"                  "Hermosillo"               
## [23] "Durango"                   "Tepic"                    
## [25] "Campeche"                  "Cuernavaca"               
## [27] "Oaxaca"                    "Zacatecas"                
## [29] "Colima"                    "Querétaro"                
## [31] "Tlaxcala"                  "La Paz"                   
## [33] "Cancún"                    "Pachuca"                  
## [35] "Mexicali"                  "Reynosa"                  
## [37] "Complemento urbano-Rural"  "Complemento urbano- Rural"
## [39] "Complemento urbano- Rural" "Complemento urbano- Rural"
## [41] "Complemento urbano-Rural"  "Complemento urbano- Rural"
## 
## $ent
##  [1] "Aguascalientes"                  "Baja California"                
##  [3] "Baja California Sur"             "Campeche"                       
##  [5] "Coahuila de Zaragoza"            "Colima"                         
##  [7] "Chiapas"                         "Chihuahua"                      
##  [9] "Distrito Federal"                "Durango"                        
## [11] "Guanajuato"                      "Guerrero"                       
## [13] "Hidalgo"                         "Jalisco"                        
## [15] "México"                          "Michoacán de Ocampo"            
## [17] "Morelos"                         "Nayarit"                        
## [19] "Nuevo León"                      "Oaxaca"                         
## [21] "Puebla"                          "Querétaro"                      
## [23] "Quintana Roo"                    "San Luis Potosí"                
## [25] "Sinaloa"                         "Sonora"                         
## [27] "Tabasco"                         "Tamaulipas"                     
## [29] "Tlaxcala"                        "Veracruz de Ignacio de la Llave"
## [31] "Yucatán"                         "Zacatecas"                      
## 
## $con
## NULL
print(get_labels(SDEMT219$clase2)) #
## [1] "No aplica"            "Población ocupada"    "Población desocupada"
## [4] "Disponibles"          "No disponibles"

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<-SDEMT219$t_loc
#x
x<-SDEMT219[["t_loc"]]  # ¡Ojo con las comillas! 
#x
x<-SDEMT219[,7]
#x
x<-SDEMT219[,"t_loc"]
#x

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

x<-SDEMT219 %>% 
  select(t_loc)

Selección “inversa”

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

x<-SDEMT219 %>% 
  select(-t_loc)

x<-SDEMT219[,-7]

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

SDEMT219$t_loc2<-SDEMT219$t_loc
SDEMT219$t_loc2<-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<-SDEMT219[SDEMT219$t_loc==1,]

También podemos seleccionar columnas

subset2<- SDEMT219[, c("eda", "sex", "ing_x_hrs")]

podemos combinar los dos tipos de selección

subset3<- SDEMT219[(SDEMT219$t_loc==5 & SDEMT219$par_c==101 ), c("eda", "sex", "ing_x_hrs")]

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

subset4<-SDEMT219 %>% 
  filter(t_loc==5 , par_c==101) %>%
    select(eda,sex, ing_x_hrs)

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(SDEMT219$t_loc)
## 
##      1      2      3      4 
## 241628  53318  50892  61593

E incluso podemos llamar las etiquetas:

table(as_label(SDEMT219$t_loc))
## 
## Localidades mayores de 100 000 habitantes 
##                                    241628 
## Localidades de 15 000 a 99 999 habitantes 
##                                     53318 
##  Localidades de 2 500 a 14 999 habitantes 
##                                     50892 
##   Localidades menores de 2 500 habitantes 
##                                     61593

En forma de dplyr

SDEMT219 %>% 
  group_by(as_label(t_loc)) %>% 
  tally() 
## # A tibble: 4 x 2
##   `as_label(t_loc)`                              n
##   <fct>                                      <int>
## 1 Localidades mayores de 100 000 habitantes 241628
## 2 Localidades de 15 000 a 99 999 habitantes  53318
## 3 Localidades de 2 500 a 14 999 habitantes   50892
## 4 Localidades menores de 2 500 habitantes    61593

Este resultado lo podemos asignar a un objeto nuevo

freq.t_loc<-table(as_label(SDEMT219$t_loc))

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.t_loc) # el gráfico más sencillo 

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

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

Vamos a modificar ligeramente los colores

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

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

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

barplot(freq.t_loc, col=heat.colors(4)) # 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")

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

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

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

Para poner título

barplot(freq.t_loc, col=gray.colors(4)) 
title(main = list("t_loces de residencia", font = 4))

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

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

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

Gráficos bivariados

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

freq.t_loc.sex<-table(as_label(SDEMT219$t_loc), as_label(SDEMT219$sex))
freq.t_loc.sex
##                                            
##                                             Hombre  Mujer
##   Localidades mayores de 100 000 habitantes 114339 122820
##   Localidades de 15 000 a 99 999 habitantes  25332  27062
##   Localidades de 2 500 a 14 999 habitantes   24222  25747
##   Localidades menores de 2 500 habitantes    29618  30915

Con este objeto vamos a graficar.

Para barras apiladas

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

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

barplot(freq.t_loc.sex,  main="Población según región y sexo",
                   col=heat.colors(5),
                     legend = rownames(freq.t_loc.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.t_loc.sex<-prop.table(freq.t_loc.sex,2)
prop.t_loc.sex
##                                            
##                                                Hombre     Mujer
##   Localidades mayores de 100 000 habitantes 0.5908656 0.5946433
##   Localidades de 15 000 a 99 999 habitantes 0.1309073 0.1310229
##   Localidades de 2 500 a 14 999 habitantes  0.1251712 0.1246562
##   Localidades menores de 2 500 habitantes   0.1530559 0.1496776
barplot(prop.t_loc.sex, main="Población según región y sexo",
                   col=heat.colors(4),
                      legend = rownames(prop.t_loc.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("ambiente_p4.RData")

Los gráficos con dplyr son más compatibles con ggplot, eso es de la siguiente práctica.

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 “e_con” [estado conyugal]

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

      1. Haga un gráfico de barras apiladas de “parentesco” vrs “clase2”, 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://forms.gle/iUMGkPn3Za6R62tw7