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