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.
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
#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"
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)
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)
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 )
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))
¿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.
Para todos los siguientes incisos, utilice colores de acuerdo a su selección en un vector:
Mandar el código a la siguiente liga: