En esta segunda sección, nos proponemos avanzar en el uso de tidyverse como una forma de facilitar la programación en R. En especial sobre dplyr (paquete dentro de tidyverse) es una gramática de manipulación de datos, que proporciona un conjunto consistente de verbos que ayudan a resolver los desafíos más comunes dentro de la transformación de datos. Con estas herramientas en nuestro maletín nos vamos a introducir al mundo de la EPH para calcular la Tasa de Desocupación. Además, presentamos algunas funciones útiles para realizar análisis exploratorio de datos. Antes que nada, conversemos sobre dos temas introductorios, pero bien importantes para manejar datos en R: los tipos de objetos y las formas de acceder a los mismos.
1. Tipos de objetos
1.1. Vectores
1.2. Matrices
1.3. Dataframes
1.4. Listas
1.5. Modificando objetos
2. Carga de datos
3. Transformación de datos
3.1. Tidyverse
3.2. Dplyr
3.2.1 Select
3.2.2 Filter
3.2.3 Arrange
3.2.4 Summarise
3.2.5 Group by
3.2.6 Mutate
3.2.7 Joins
3.2.8 pipe
3.3. Tidyr
3.4. Lubridate
3.5. Stringr
Ya hemos visto en la jornada anterior, aunque sin querer explicitarlo mucho, un contenedor básico: los vectores. Habíamos dicho que los mismos no pueden contener más de un tipo de dato distinto en su interior. Es decir, podemos tener vectores numéricos, de texto o lógicos. Y que la sintaxis para definirlos es con c( ).
notas_alumnes <- c(9, 8, 7, 9, 10)
¿Recuerdan que pasaba si mezclaba tipos de datos distintos cuando estoy definiendo un vector? Por ejemplo:
notas_alumnes <- c('A', TRUE, 7, 'C', 10)
Otro tipo de objeto son las matrices, no vamos a profundizar en ellas. De todas formas, si es importante que por sepan que existen, ya que muchas veces cuando obtenemos un resultado de alguna función en R, el tipo de objeto que nos devuelve R es una Matriz.:
# Creamos una matriz de 3x3 con numeros del 1 al 9
mi_matriz <- matrix(1:9, nrow = 3, ncol = 3, byrow = TRUE)
#Le pregunto al R si el objeto que defini es una matriz
is.matrix(mi_matriz)
## [1] TRUE
Como una combinación de vectores y matrices, tenemos los dataframes. Este sí, es el tipo de objeto que es más común para nosotres, nos recuerda mucho a las tablas en Excel, Spss o Stata. Es muy importante considerar que en general nuestros datos contienen OBSERVACIONES (o casos) en las FILAS y VARIABLES (o características de esas observaciones) en las COLUMNAS. Cada columna será una característica distinta de esa UNIDAD DE ANÁLISIS. Otro elemento a destacar es que, en un Data Frame cada columna es un vector y puede ser tratada como tal. Vamos a definir una tabla básica con las características de nuestros alumnes.
# Tenemos las notas de 5 estudiantes
notas_alumnes <- c(9, 8, 7, 9, 10)
#Ahora escribimos los nombre
# El orden de los nombres tiene que corresponder a sus notas
nombre_alumnes <- c('Maria', 'Juana', 'Pedro', 'Mariana', 'Inti')
#Ahora definimos una nota de concepto
concepto_alumnes <- c('Muy bueno', 'Bueno', 'Muy bueno', 'Regular', 'Bueno')
#Hagamos una tabla con toda la información
curso <- data.frame(nombres = nombre_alumnes,
notas = notas_alumnes,
concepto= concepto_alumnes)
curso
## nombres notas concepto
## 1 Maria 9 Muy bueno
## 2 Juana 8 Bueno
## 3 Pedro 7 Muy bueno
## 4 Mariana 9 Regular
## 5 Inti 10 Bueno
Por último, hay un tipo especial de objetos, que se llama lista. La particularidad es que pueden contener cualquier tipo de objetos e incluso. Por ejemplo, puede tener un data frame o varios, a la vez que contiene otro vector u otra lista. Parece un poco rebuscado (al principio lo es) pero paso a paso diría Mostaza. Veamos un ejemplo:
# Voy a poner todo lo que tengo en una lista
mi_lista <- list(tabla= curso,
matriz= mi_matriz,
mi_nombre= 'Leandro', mi_edad=25)
mi_lista
## $tabla
## nombres notas concepto
## 1 Maria 9 Muy bueno
## 2 Juana 8 Bueno
## 3 Pedro 7 Muy bueno
## 4 Mariana 9 Regular
## 5 Inti 10 Bueno
##
## $matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
##
## $mi_nombre
## [1] "Leandro"
##
## $mi_edad
## [1] 25
Las listas pueden ser muy útiles para guardar, por ejemplo, múltiples tablas. También es bueno conocerlas, porque suelen ser el contenedor de resultados como gráficos o modelos estadísticos.
Todos los objetos que hemos visto, además de lo que contienen adentro, tienen otros atributos, como ser la clase (que vimos en la jornada anterior), los nombres, el largo, etc. Un atributo muy importante es el índice. El cual nos sirve para acceder a un elemento específico de nuestro objeto. Veamos de manera resumida algunos ejemplos. Los vectores son objetos que tienen una sola dimensión. Por lo cual a ellos podemos acceder con el número de posición del elemento o cuando cumplen una condición lógica, es decir que se quede con los elementos que cumplen determinada condición.
#Volvemos a los alumnes
notas_alumnes <- c(9, 8, 7, 9, 10)
#El indice en R comienza en 1
notas_alumnes[3]
## [1] 7
# Notas menores a 8
notas_alumnes[notas_alumnes < 8]
## [1] 7
Para los objetos que tienen dos dimensiones como las matrices y los data frames, la dinámica es la misma sólo que tenemos que agregar las columnas de referencia. Además, es bueno mencionar que, si queremos acceder a una columna y tratarla como si fuera un vector, podemos acceder a ella escribiendo nombre_tabla$nombre_columna.
# Me quedo con el primer registro de la primer columna
curso[ 1, 1]
## [1] "Maria"
# Segunda fila todos los registros
curso[ 2, ]
## nombres notas concepto
## 2 Juana 8 Bueno
#Todos los que tienen mayor o igual que 9 en nota
curso[ curso$notas >= 9, ]
## nombres notas concepto
## 1 Maria 9 Muy bueno
## 4 Mariana 9 Regular
## 5 Inti 10 Bueno
A continuación, revisamos las funciones que usamos para cargar en nuestro ambiente de trabajo los diferentes tipos de extensiones. Además, les explicamos que especificando el encoding (es decir la codificación del texto que interpreta la pc) pueden evitar que les aparezcan símbolos extraños (por ejemplo cuando en vez de la á aparece Ã). Esto último es clave para todas las tareas que vayamos a realizar con los datos. Pero previo a sumergirnos, queremos aclarar que podemos cargar los archivos csv de tres maneras distintas:
- Con la ruta local del archivo (es decir la ubicación del archivo dentro de mi pc desde el disco duro c en adelante). Esto es lo mismo, que abrir en word la opción archivo y abrir para buscar un documento en las carpetas de sus pc. La única diferencia es que en vez de hacer clic en botones tienen que escribir la ruta. Para probar las diferentes formas de cargar, les dejemos una carpeta con los archivos necesarios acá.
# Cargar un archivo que está en la carpeta de descargas (recuerden cambiar el nombre de las carpetas)
forma1 <- read.csv("C:/Users/flavi/Downloads/encc_2017.csv", encoding = "UTF-8")
- Seteando y accediendo a las carpetas/archivos a través del directorio. Para esto primero, definen la carpeta que van a utilizar como directorio de trabajo. Para luego, guardar en ella todos los archivos que necesitan.
# Seteo mi carpeta de descarga como directorio (Recuerden actualiza de acuerdo a las carpetas en sus computadoras)
setwd("C:/Users/flavi/Downloads/")
# Cargo la base en el ambiente de trabajo
forma2 <- read.csv("encc_2017.csv", encoding = "UTF-8")
- Con el link de internet (pero recuerden que pueden dar de bajo el archivo. Por esto, la opción local es más segura pero menos inmediata)
# Cargo
forma3 <- read.csv("https://datos.cultura.gob.ar/dataset/251c2ac2-e670-451c-9dbf-a4212af225b5/resource/171494ce-e3cf-43fb-ad6e-f204bae1bb19/download/encc_2017.csv", encoding = "UTF-8")
Como ya saben, r nos permite de distinta forma alcanzar un mismo objetivo. A continuación presentamos, las funciones más comunes para cargar un csv/txt. Algunas vienen por default en r (como parte de rbase, utils, etc.), en otras es necesario activar un paquete.
Dentro de las funciones que viene por default en r se encuentran: - read.delim() [se puede especificar delimitador] - read.csv() [delimitador “,”] - read.csv2() [delimitador “;”]
# Vector con el link de descarga
link <- "https://datos.cultura.gob.ar/dataset/251c2ac2-e670-451c-9dbf-a4212af225b5/resource/171494ce-e3cf-43fb-ad6e-f204bae1bb19/download/encc_2017.csv"
# Prueba de lectura (no creamos objetos porque es sólo una prueba de cómo funcionan)
read.delim(link,sep = ",", encoding = "UTF-8")
# Podemos usar read.csv porque el delimitador es una coma (,). ¿Por qué no se puede usar read.csv2? Porque es para los archivos separados por punto y coma (;)
read.csv(link, encoding = "UTF-8")
Hay una función que tiene como beneficio la posibilidad de cargar la tabla únicamente con las variables que son de interés para nosotres. Este es muy bueno, para cuando tenemos tablas muy grandes y nuestras pc no cumplen con los requerimientos de memorias necesarios para cargar todos los datos. Además, tiene una muy buena performance en la lectura del archivo. La función se llama fread y se encuentra en el paquete data.table.
fread()[se puede especificar delimitador]
# Activo el paquete data.table
library(data.table)
# Creamos vectores para seleccionar únicamente las variables que nos interesan.
variables <- c("id", "pondera_dem", "fecha", "region", "sexo", "edad", "p1"," p1otros",
"p2", "p3", "p4", "p5", "p6horas", "p6minutos")
# Cargamos la tabla únicamente con las variables selecionadas
fread(link, select = variables, sep = ",", encoding = "UTF-8")
Dentro del paquete readr de la familia tidyverse encontramos:
read_csv() [delimitador “,”] read_csv2() [delimitador “,”]
# Cargo la biblioteca
library(tidyverse)
# Prueba de lectura (no creamos objetos porque es sólo una prueba de cómo funcionan)
read_csv(link,,locale = locale(encoding = "UTF-8") )
# Podemos usar read_csv porque el delimitador es una coma (,). ¿Por qué no se puede usar read_csv2? Porque es para los archivos separados por punto y coma (;)
Las planillas de Excel son quizás el formato más común que nos encontremos, por eso es bueno conocer la función de lectura básica. ¡Para eso cargamos la librería readxl y aplicamos la función léeme el excel y listo! read_excel() # Cargo la biblioteca
library(readxl)
# Cargo el archivo desde mi directorio de trabajo (recuerden cambiar el nombre de las carpetas)
archivo_excel <- read_excel("CuadroDeuda.xlsx")
La librería haven permite leer archivos de varios orígenes como SPSS, Stata y SAS.
# Cargo la biblioteca
library(haven)
# Cargo el archivo SPSS
archivo_spss <- read_sav("datos/LOWBWT.sav",encoding = "UTF-8")
# Cargo el achivo de stata
archivo_stata <- read_dta("datos/LOWBWT.dta",encoding = "UTF-8")
# Cargo el archivo de archivo sas
archivo_sas <- read_sas("datos/LOWBWT.sas7bdat",encoding = "UTF-8")
Función | Paquete | Extensión | Encoding |
---|---|---|---|
read_delim | utils (default) | .csv/.txt [Especificar delimitador] | encoding = “UTF-8” |
read.csv | utils (default) | .csv/.txt [Delimitador “,”] | encoding = “UTF-8” |
read.csv2 | utils (default) | .csv/.txt [Delimitador “;”] | encoding = “UTF-8” |
read_csv | readr | .csv/.txt [Delimitador “,”] | locale(encoding = “UTF-8”) |
read_csv2 | readr | .csv/.txt [Delimitador “;”] | locale(encoding = “UTF-8”) |
fread | data.table | .csv/.txt [Especificar delimitador] | encoding = ‘UTF-8’ |
read_excel | readxl | .xlsx | - |
read_sav | haven | .sas7bdat | encoding = ‘UTF-8’ |
read_dta | haven | .dta | encoding = ‘UTF-8’ |
read_sas | haven | .sas | encoding = ‘UTF-8’ |
Cómo ven se puede leer cualquier archivo de una forma simple y con una sintaxis amigable. En todos los casos vimos que el único parámetro obligatorio fue la dirección del archivo. Lo bueno de R, es que cuando cargamos una tabla. Las transformaciones no las hacemos sobre el archivo original, sino que las hacemos sobre el objeto de R. Por eso no nos tenemos que preocupar por mandarnos un lío y guardar. Está todo escrito y uno lo ejecuta cuando quiere.
Ahora, si queremos guardar una tabla transformada, también lo podemos hacer de una forma muy sencilla, en vez de decirle a R lee, le vamos a decir escribí. Como en este ejemplo:
write.csv(x = archivo_excel, file = "resultados/CuadroDeuda.csv")
Cuando guardamos un archivo tenemos dos parámetros obligatorios. El primero le dice a R que va a guardar y el segundo dónde, con qué nombre y que extensión va a tener.
Con esto es más que suficiente para que comiencen a leer sus datos. No obstante, sepan que con R nos podemos conectar a bases de datos como SQLServer, SQLite, PostgresSQL y más. Hay conexiones de todo tipo y color.
Tidyverse es una colección de paquetes de código abierto que fue creada por Hadley Wickham que hoy en día funciona como un paradigma de programación en R. Esto es así porque el conjunto de bibliotecas, veremos algunas funciones de algunos de ellos, permiten hacer de forma simplificada y más legible muchas de las cosas que podemos hacer con R base. Si utilizan R lo más probable es que la primera biblioteca que activen será tidyverse. Sin ir más lejos ya la hemos usado en múltiples ocasiones. Son parte de tidyverse ggplot. dplyr, tidyr, haven, stringr, lubridate, forecast, tidymodel y más.
# Activamos la libreria
library(tidyverse)
Pasemos a ver cómo se realizan algunas de estas acciones con el concepto de **dplyr¨¨. A modo de simplificación, son seis las principales funciones a utilizar: filter, mutate, select, arrange, group_by y summarise. Sus nombres son verbos que nos indican que es lo que vamos a hacer: manipular datos. Antes de pasar a la EPH, vamos a traer un set de datos de la Encuesta Nacional de Consumos Culturales, que descargamos desde aquí. Vamos a cargar el Set de datos y aplicar las funciones de Tidyverse sobre el mismo.
rm(list = ls()) #limpiamos el ambiente de trabajo
# Cargamos los datos de la encuesta
encuesta_cc <- read_csv("https://datos.cultura.gob.ar/dataset/251c2ac2-e670-451c-9dbf-a4212af225b5/resource/171494ce-e3cf-43fb-ad6e-f204bae1bb19/download/encc_2017.csv") %>%
as.data.frame() #Cargar tabla
encuesta_cc #Imprimo la tabla
## id pondera_dem fecha
## 1 1 8608 23/5/2017
## 2 2 2869 10/5/2017
## region sexo edad
## 1 CENTRO Varón 19
## 2 CENTRO Varón 24
## p1
## 1 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 2 EL ARTE, LO CULTO
## p1otros p2 p2_1 p2_1otro
## 1 <NA> SI <NA> <NA>
## 2 <NA> SI <NA> <NA>
## p2_2 p3
## 1 <NA> SI
## 2 <NA> NO
## p4 p5
## 1 ALGUNAS VECES AL MES FM
## 2 ALGUNOS DIAS POR SEMANA FM
## p6horas p6minutos
## 1 1 0
## 2 1 0
## horas_radio minutos_radio
## 1 1 0
## 2 1 0
## p7_1
## 1 ALGUNAS VECES AL MES
## 2 ALGUNOS DIAS POR SEMANA
## p7_2
## 1 NUNCA
## 2 ALGUNOS DIAS POR SEMANA
## p7_3
## 1 NUNCA
## 2 NUNCA
## p7_4
## 1 ALGUNAS VECES AL MES
## 2 ALGUNOS DIAS POR SEMANA
## p7_5
## 1 NUNCA
## 2 NUNCA
## p8a
## 1 MUSICALES
## 2 INFORMATIVOS / NOTICIEROS
## p8b
## 1 ACTUALIDAD / MAGAZINE
## 2 MUSICALES
## p8c p8d p8e p8f
## 1 <NA> <NA> <NA> <NA>
## 2 CULTURALES <NA> <NA> <NA>
## p8g p8otros p9 p10 p10_1
## 1 <NA> <NA> 1 SI <NA>
## 2 <NA> <NA> 0 SI <NA>
## p10_1otr p10_2
## 1 NA <NA>
## 2 NA <NA>
## p11
## 1 ALGUNOS DIAS POR SEMANA
## 2 TODOS O CASI TODOS LOS DIAS
## p12horas p12minutos
## 1 1 30
## 2 3 0
## horas_musica minutos_musica
## 1 1 30
## 2 3 0
## p13_1
## 1 NUNCA
## 2 NUNCA
## p13_2
## 1 ALGUNAS VECES AL MES
## 2 ALGUNOS DIAS POR SEMANA
## p13_3
## 1 ALGUNAS VECES AL MES
## 2 TODOS O CASI TODOS LOS DIAS
## p13_4
## 1 ALGUNOS DIAS POR SEMANA
## 2 ALGUNA VEZ CADA 3 MESES
## p13_5 p13_6 p13_7 p13_8
## 1 NUNCA NUNCA NUNCA NUNCA
## 2 NUNCA NUNCA NUNCA NUNCA
## p13_9
## 1 ALGUNOS DIAS POR SEMANA
## 2 NUNCA
## p14_1 p14_2
## 1 NUNCA NUNCA
## 2 HABITUALMENTE CASI NUNCA
## p14_3 p14_4 p14_5
## 1 HABITUALMENTE NUNCA NUNCA
## 2 HABITUALMENTE NUNCA NUNCA
## p14_6
## 1 DE VEZ EN CUANDO
## 2 DE VEZ EN CUANDO
## p14_7 p14_8
## 1 DE VEZ EN CUANDO NUNCA
## 2 DE VEZ EN CUANDO CASI NUNCA
## p14_9 p14_10
## 1 NUNCA NUNCA
## 2 CASI NUNCA NUNCA
## p14_11
## 1 DE VEZ EN CUANDO
## 2 DE VEZ EN CUANDO
## p14_12 p14_13
## 1 DE VEZ EN CUANDO NUNCA
## 2 NUNCA NUNCA
## p14_14 p15 p16
## 1 NUNCA 6 canciones SI
## 2 NUNCA 9 canciones SI
## p17_1
## 1 ALGUNOS DIAS POR SEMANA
## 2 TODOS O CASI TODOS LOS DIAS
## p17_2
## 1 ALGUNA VEZ AL AÑO O MENOS
## 2 ALGUNOS DIAS POR SEMANA
## p18a p18b p18c
## 1 YOUTUBE <NA> <NA>
## 2 GOOGLE PLAY YOUTUBE <NA>
## p18d p18e p18f p18g
## 1 <NA> <NA> <NA> NA
## 2 <NA> <NA> <NA> NA
## p18otros p19 p20 p21 p22
## 1 <NA> 0 0 0 0
## 2 <NA> 150 0 0 0
## p23
## 1 NO
## 2 SI
## p23_1
## 1 PORQUE LAS ENTRADAS ESTAN CARAS
## 2 <NA>
## p23_1otr p23_2
## 1 <NA> SI
## 2 <NA> <NA>
## p24
## 1 <NA>
## 2 TODAS O CASI TODAS LAS SEMANAS
## p25 p25_bis p25_1
## 1 <NA> 0 <NA>
## 2 13 13 13
## p25_1_bis p26 p26_bis p27
## 1 0 <NA> 0 NO
## 2 13 500 500 SI
## p27_1 p28 p29 p29_1
## 1 0 NO SI <NA>
## 2 2 SI SI <NA>
## p29_1otr p29_2 p30 p30_bis
## 1 <NA> <NA> 3 3
## 2 <NA> <NA> 6 6
## p31horas p31minutos
## 1 1 0
## 2 0 30
## horas_diario minutos_diario
## 1 1 0
## 2 0 30
## p32 p33
## 1 ALGUNAS VECES AL MES 0
## 2 ALGUNA VEZ AL AÑO 0
## p33_bis p33_1 p33_1_bis
## 1 0 0 0
## 2 0 0 0
## p34
## 1 TODOS O CASI TODOS LOS DIAS
## 2 TODOS O CASI TODOS LOS DIAS
## p34_1
## 1 CELULAR
## 2 CELULAR
## p35_1
## 1 MENOS DE UNA VEZ POR MES
## 2 NUNCA
## p35_2
## 1 NUNCA
## 2 NUNCA
## p35_3
## 1 TODOS O CASI TODOS LOS DIAS
## 2 TODOS O CASI TODOS LOS DIAS
## p36 p37 p37_1
## 1 AMBAS POR IGUAL NO NO
## 2 AMBAS POR IGUAL SI <NA>
## p38
## 1 <NA>
## 2 ALGUNOS DIAS POR SEMANA
## p39 p39_bis p39_1
## 1 <NA> 0 <NA>
## 2 0 0 0
## p39_1_bis p40 p40_bis
## 1 0 <NA> 0
## 2 0 0 0
## p41
## 1 <NA>
## 2 TODOS O CASI TODOS LOS DIAS
## p42 p42_1 p42_1otr p42_2
## 1 SI <NA> <NA> <NA>
## 2 SI <NA> <NA> <NA>
## p43 p43_bis p43_1 p43_1_bis
## 1 1 1 0 0
## 2 3 3 2 2
## p44
## 1 SE LO HABIA RECOMENDADO UN PROFESOR, REFERENTE POLITICO, RELIGIOSO O ESPIRITUAL
## 2 PORQUE ESTABA EN SU CASA
## p44otros p45 p45_bis p45_1
## 1 <NA> 1 1 600
## 2 <NA> 0 0 0
## p45_1_bis
## 1 600
## 2 0
## p46
## 1 ALGUNAS VECES AL MES
## 2 ALGUNA VEZ CADA 3 MESES
## p47
## 1 NO LEYO LIBROS EN PANTALLA, SOLO EN PAPEL
## 2 ALGUNA VEZ CADA 3 MESES
## p47_1a p47_1b p47_1c
## 1 <NA> <NA> <NA>
## 2 COMPUTADORA <NA> <NA>
## p47_1d p47_2 p48_1
## 1 NA <NA> CASI NUNCA
## 2 NA NO CASI NUNCA
## p48_2 p48_3
## 1 NUNCA NUNCA
## 2 CASI NUNCA NUNCA
## p48_4
## 1 NUNCA
## 2 DE VEZ EN CUANDO
## p48_5 p48_6 p48_7
## 1 HABITUALMENTE NUNCA NUNCA
## 2 NUNCA NUNCA NUNCA
## p48_8 p48_9
## 1 NUNCA NUNCA
## 2 DE VEZ EN CUANDO NUNCA
## p48_10 p48_11
## 1 NUNCA NUNCA
## 2 NUNCA NUNCA
## p48_12
## 1 DE VEZ EN CUANDO
## 2 CASI NUNCA
## p48_13 p48_14
## 1 HABITUALMENTE NUNCA
## 2 NUNCA NUNCA
## p48_15 p48_16 p49 p49_1
## 1 NUNCA NUNCA SI <NA>
## 2 CASI NUNCA NUNCA SI <NA>
## p49_2 p50horas p50minutos
## 1 <NA> 1 0
## 2 <NA> 0 45
## horas_TV minutos_TV
## 1 1 0
## 2 0 45
## p51a
## 1 TELEVISION POR CABLE
## 2 TELEVISION DIGITAL ABIERTA, CON DECODIFICADOR/ SINTONIZADOR
## p51b
## 1 <NA>
## 2 <NA>
## p52
## 1 NO MIRA
## 2 ALGUNAS VECES POR SEMANA
## p53
## 1 UNA HORA O MENOS AL DIA
## 2 NO MIRA
## p54_1 p54_2 p54_3
## 1 NUNCA NUNCA NUNCA
## 2 NUNCA NUNCA NUNCA
## p54_4
## 1 TODOS O CASI TODOS LOS DIAS
## 2 ALGUNOS DIAS POR SEMANA
## p55_1 p55_2
## 1 NUNCA NUNCA
## 2 DE VEZ EN CUANDO NUNCA
## p55_3 p56 p56_1
## 1 NUNCA 2 1
## 2 CASI NUNCA 1 NINGUNO
## p56_1_bis p57 p57_1
## 1 1 SI <NA>
## 2 NINGUNO SI <NA>
## p57_1otr p57_2 p58_1
## 1 NA <NA> NUNCA
## 2 NA <NA> NUNCA
## p58_2
## 1 ALGUNAS VECES AL MES
## 2 TODOS O CASI TODOS LOS DIAS
## p58_3
## 1 ALGUNAS VECES AL MES
## 2 ALGUNOS DIAS POR SEMANA
## p58_4 p58_5
## 1 NUNCA NUNCA
## 2 NUNCA ALGUNA VEZ AL AÑO
## p58_6
## 1 ALGUNOS DIAS POR SEMANA
## 2 ALGUNOS DIAS POR SEMANA
## p58_7
## 1 TODOS O CASI TODOS LOS DIAS
## 2 ALGUNOS DIAS POR SEMANA
## p59_1
## 1 ALGUNA VEZ AL AÑO
## 2 NUNCA
## p59_2
## 1 ALGUNA VEZ AL AÑO
## 2 NUNCA
## p59_3
## 1 TODOS O CASI TODOS LOS DIAS
## 2 ALGUNOS DIAS POR SEMANA
## p59_4
## 1 NUNCA
## 2 NUNCA
## p59_5
## 1 ALGUNA VEZ AL AÑO
## 2 ALGUNOS DIAS POR SEMANA
## p59_6
## 1 NUNCA
## 2 ALGUNA VEZ CADA 3 MESES
## p60 p61 p62 p63 p63_1
## 1 150 0 0 SI <NA>
## 2 1350 0 0 SI <NA>
## p63_1otr p63_2
## 1 <NA> <NA>
## 2 <NA> <NA>
## p64
## 1 ALGUNA VEZ AL AÑO O MENOS
## 2 ALGUNA VEZ CADA 3 MESES
## p65 p65_bis p65_1 p65_1_bis
## 1 1 1 0 0
## 2 3 3 2 2
## p66
## 1 NO TENIA DECIDIDO IR A VERLA, LA ELIGIO EN EL MOMENTO
## 2 NO TENIA DECIDIDO IR A VERLA, LA ELIGIO EN EL MOMENTO
## p66otros p67_1
## 1 <NA> DE VEZ EN CUANDO
## 2 <NA> CASI NUNCA
## p67_2 p67_3
## 1 NUNCA NUNCA
## 2 NUNCA CASI NUNCA
## p67_4 p67_5
## 1 DE VEZ EN CUANDO NUNCA
## 2 DE VEZ EN CUANDO NUNCA
## p67_6
## 1 HABITUALMENTE
## 2 DE VEZ EN CUANDO
## p67_7 p67_8
## 1 NUNCA NUNCA
## 2 HABITUALMENTE CASI NUNCA
## p67_9 p67_10
## 1 NUNCA NUNCA
## 2 HABITUALMENTE NUNCA
## p67_11 p68
## 1 NUNCA NO
## 2 CASI NUNCA SI
## p69
## 1 <NA>
## 2 ALGUNA VEZ CADA 3 MESES
## p70 p70_bis p70_1
## 1 <NA> 0 <NA>
## 2 2 2 2
## p70_1_bis p71 p71_bis p72
## 1 0 <NA> 0 SI
## 2 2 500 500 SI
## p72_1 p72_1otr p72_2 p73
## 1 <NA> <NA> <NA> <NA>
## 2 <NA> <NA> <NA> <NA>
## p74 p74_1 p74_2 p74_3 p74_4
## 1 SI <NA> <NA> NS/NC NS/NC
## 2 NO NO <NA> <NA> <NA>
## p74_4_bis
## 1 NS/NC
## 2 0
## p75_1
## 1 ALGUNAS VECES AL MES
## 2 ALGUNAS VECES AL MES
## p75_2
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 TODOS O CASI TODOS LOS DÍAS
## p75_3
## 1 NUNCA
## 2 NUNCA
## p75_4
## 1 ALGUNOS DIAS POR SEMANA
## 2 NUNCA
## p76horas p76minutos
## 1 8 NO USA
## 2 2 NO USA
## horas_internet
## 1 8
## 2 2
## minutos_internet
## 1 NO USA
## 2 NO USA
## p77_1
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 NUNCA
## p77_2
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 TODOS O CASI TODOS LOS DÍAS
## p77_3
## 1 ALGUNAS VECES AL MES
## 2 NUNCA
## p77_4
## 1 ALGUNAS VECES AL MES
## 2 ALGUNA VEZ AL AÑO O MENOS
## p77_5
## 1 ALGUNAS VECES AL MES
## 2 ALGUNA VEZ AL AÑO O MENOS
## p77_6 p77_7
## 1 NUNCA NUNCA
## 2 NUNCA NUNCA
## p77_8
## 1 NUNCA
## 2 TODOS O CASI TODOS LOS DÍAS
## p77_9
## 1 NUNCA
## 2 ALGUNAS VECES AL MES
## p77_10
## 1 ALGUNAS VECES AL MES
## 2 ALGUNA VEZ AL AÑO O MENOS
## p78_1 p78_2 p78_3 p78_4
## 1 SI SI SI NO
## 2 SI NO SI NO
## p78_5
## 1 NO
## 2 NO
## p78_1_1
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 TODOS O CASI TODOS LOS DÍAS
## p78_1_2
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 <NA>
## p78_1_3
## 1 TODOS O CASI TODOS LOS DÍAS
## 2 NUNCA
## p78_1_4 p78_1_5 p78_2b
## 1 <NA> <NA> NO
## 2 <NA> <NA> NO
## p78_3b_1 p78_3b
## 1 <NA> NA
## 2 <NA> NA
## p79_1
## 1 NUNCA
## 2 ALGUNA VEZ CADA 3 MESES
## p79_2
## 1 ALGUNA VEZ AL AÑO O MENOS
## 2 ALGUNAS VECES AL MES
## p79_3
## 1 ALGUNA VEZ AL AÑO O MENOS
## 2 ALGUNA VEZ CADA 3 MESES
## p79_4 p79_5
## 1 NUNCA NUNCA
## 2 NUNCA NUNCA
## p79_6
## 1 ALGUNAS VECES AL MES
## 2 ALGUNA VEZ CADA 3 MESES
## p79_7
## 1 ALGUNAS VECES AL MES
## 2 ALGUNAS VECES AL MES
## p80horas p80minutos
## 1 4 0
## 2 1 0
## horas_redes minutos_redes
## 1 4 0
## 2 1 0
## p81
## 1 COMENTA, COMPARTE, PARTICIPA Y/U OPINA FRENTE A CONTENIDOS
## 2 OBSERVA LOS CONTENIDOS, SIN HACER COMENTARIOS
## p81_1a p81_1b p81_1c p81_1d
## 1 <NA> <NA> <NA> <NA>
## 2 <NA> <NA> <NA> <NA>
## p81_1e p81_1f p81_1g p81_1h
## 1 <NA> <NA> <NA> <NA>
## 2 <NA> <NA> <NA> <NA>
## p81_1i p81_1j p81_1k p81_1l
## 1 NA NA NA NA
## 2 NA NA NA NA
## p82 p83 p84 p85 p85_1
## 1 1 1 SI 1 SI
## 2 1 NINGUNA NO 1 SI
## p85_2 p85_3 p85_3_bis p86
## 1 SI 400 400 0
## 2 NO 145 145 0
## p87 p88
## 1 SI ALGUNOS DIAS POR SEMANA
## 2 NO <NA>
## p89horas p89minutos
## 1 1 0
## 2 NA NA
## horas_videojuegos
## 1 1
## 2 0
## minutos_videojuegos p90_1
## 1 0 NUNCA
## 2 0 <NA>
## p90_2
## 1 TODOS O CASI TODOS LOS DIAS
## 2 <NA>
## p90_3 p90_4 p91 p91_bis
## 1 NUNCA NUNCA 0 0
## 2 <NA> <NA> <NA> 0
## p92_1 p92_2 p92_3 p92_4
## 1 NO NO NO NO
## 2 NO NO NO NO
## p92_5 p92_6 p92_7 p92_8
## 1 NO NO NO NO
## 2 NO NO NO NO
## p92_9 p93_1 p93_2 p93_3
## 1 NO <NA> <NA> <NA>
## 2 NO <NA> <NA> <NA>
## p93_4 p94_1 p94_2 p94_3
## 1 <NA> <NA> <NA> <NA>
## 2 <NA> <NA> <NA> <NA>
## p94_4 p94_5 p94_6 p95 p96_1
## 1 <NA> <NA> <NA> SI NO
## 2 <NA> <NA> <NA> SI NO
## p96_2 p96_3 p96_4 p96_5
## 1 NO NO NO NO
## 2 NO NO NO NO
## p97 p97_bis p98 p99
## 1 <NA> 0 SI 1
## 2 <NA> 0 SI 2
## p99_bis p100_1
## 1 1 UNA VEZ AL AÑO
## 2 2 NUNCA
## p100_2
## 1 NUNCA
## 2 UNA VEZ AL AÑO
## p100_3 p100_4
## 1 NUNCA NUNCA
## 2 UNA VEZ AL AÑO NUNCA
## p100_5 p100_6 p101
## 1 NUNCA NUNCA FUE GRATUITO
## 2 NUNCA NUNCA FUE GRATUITO
## p102 p102_bis
## 1 0 0
## 2 0 0
## p103_1
## 1 HACE MAS DE 5 AÑOS
## 2 VARIAS VECES EN EL ULTIMO AÑO
## p103_1_1 p103_2
## 1 <NA> NO FUE NUNCA
## 2 1000 ENTRE 1 Y 5 AÑOS
## p103_1_2
## 1 <NA>
## 2 <NA>
## p103_3
## 1 HACE MAS DE 5 AÑOS
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_1_3
## 1 <NA>
## 2 400
## p103_4
## 1 VARIAS VECES EN EL ULTIMO AÑO
## 2 VARIAS VECES EN EL ULTIMO AÑO
## p103_1_4 p103_5
## 1 300 NO FUE NUNCA
## 2 300 NO FUE NUNCA
## p103_1_5 p103_6
## 1 <NA> ENTRE 1 Y 5 AÑOS
## 2 <NA> ENTRE 1 Y 5 AÑOS
## p103_1_6
## 1 <NA>
## 2 <NA>
## p103_7
## 1 NO FUE NUNCA
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_1_7
## 1 <NA>
## 2 0
## p103_8
## 1 NO FUE NUNCA
## 2 VARIAS VECES EN EL ULTIMO AÑO
## p103_1_8
## 1 <NA>
## 2 0
## p103_9
## 1 NO FUE NUNCA
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_1_9
## 1 <NA>
## 2 100
## p103_10
## 1 1 VEZ EN EL ULTIMO AÑO
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_110 p103_11
## 1 50 NO FUE NUNCA
## 2 600 NO FUE NUNCA
## p103_111 p103_12
## 1 <NA> NO FUE NUNCA
## 2 <NA> NO FUE NUNCA
## p103_112
## 1 <NA>
## 2 <NA>
## p103_13
## 1 NO FUE NUNCA
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_113 p103_14
## 1 <NA> NO FUE NUNCA
## 2 0 NO FUE NUNCA
## p103_114 p103_15
## 1 <NA> NO FUE NUNCA
## 2 <NA> NO FUE NUNCA
## p103_115 p103_16
## 1 <NA> NO FUE NUNCA
## 2 <NA> NO FUE NUNCA
## p103_116 p103_17
## 1 <NA> NO FUE NUNCA
## 2 <NA> NO FUE NUNCA
## p103_117
## 1 <NA>
## 2 <NA>
## p103_18
## 1 NO FUE NUNCA
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_118
## 1 <NA>
## 2 0
## p103_19
## 1 NO FUE NUNCA
## 2 1 VEZ EN EL ULTIMO AÑO
## p103_119 p103_20
## 1 <NA> NO FUE NUNCA
## 2 0 ENTRE 1 Y 5 AÑOS
## p103_120 p104 p104_1 p104_2
## 1 <NA> 6 3 0
## 2 <NA> 1 NA NA
## p105 p106
## 1 3 SECUNDARIA INCOMPLETA
## 2 2 SECUNDARIA COMPLETA
## p107
## 1 OTRO MIEMBRO DEL HOGAR
## 2 LA PERSONA QUE FUE ENTREVISTADA
## p108 p109
## 1 SECUNDARIA COMPLETA TRABAJA
## 2 <NA> TRABAJA
## p110
## 1 EMPLEADO
## 2 ATENCION AL PUBLICO
## p110b
## 1 TRABAJADOR/OBRERO CALIFICADO. EMPLEADO ADMINISTRATIVO MEDIO
## 2 TRABAJADOR/OBRERO CALIFICADO. EMPLEADO ADMINISTRATIVO MEDIO
## p111 p111b p112 p113_1
## 1 <NA> <NA> SI SI
## 2 <NA> <NA> NO NO
## p113_2 p113_3 p113_4 p113_5
## 1 SI NO SI SI
## 2 NO NO NO SI
## p114 p115_1 p115_2
## 1 PROPIA NO NO
## 2 PRESTADA NO NO
## p115_3 p115_4 p115_5
## 1 NO NO NO
## 2 NO NO NO
## p116
## 1 BARRIO DE VIVIENDA SOCIAL
## 2 BARRIO DE VIVIENDA SOCIAL
## p116b
## 1 BARRIO DE VIVIENDA SOCIAL
## 2 BARRIO DE VIVIENDA SOCIAL
## p117 NSEpuntaje
## 1 CASA 66
## 2 DEPARTAMENTO 46
## NSEcat1 minutos_radio_1
## 1 C3 60
## 2 D1 60
## minutos_radio_total
## 1 60
## 2 60
## horas_radio_total
## 1 1
## 2 1
## minutos_musica_1
## 1 60
## 2 180
## minutos_musica_total
## 1 90
## 2 180
## horas_musica_total
## 1 1.5
## 2 3.0
## minutos_diario_1
## 1 60
## 2 0
## minutos_diario_total
## 1 60
## 2 30
## horas_diario_total
## 1 1.0
## 2 0.5
## minutos_tv_1
## 1 60
## 2 0
## minutos_tv_total
## 1 60
## 2 45
## horas_tv_total
## 1 1.00
## 2 0.75
## minutos_internet_1
## 1 480
## 2 120
## minutos_internet_total
## 1 480
## 2 120
## horas_internet_total
## 1 8
## 2 2
## minutos_redes_1
## 1 240
## 2 60
## minutos_redes_total
## 1 240
## 2 60
## horas_redes_total
## 1 4
## 2 1
## minutos_videojuegos_1
## 1 60
## 2 0
## minutos_videojuegos_total
## 1 60
## 2 0
## horas_videojuegos_total
## 1 1
## 2 0
## [ reached 'max' / getOption("max.print") -- omitted 2800 rows ]
Lo más conveniente para realizar una inspección a la tabla es realizar algunas de las funciones de Análisis exploratorio de datos que vimos en la jornada anterior. Como el objetivo de este apartado es otro, lo vamos a dejar para que practiquen cada une de ustedes. Podemos descargar desde aquí el cuestionario aplicado en la encuesta.
¡Ahora sí, empecemos con la presentación y la práctica de las funciones de dplyr!
Lo primero que tenemos que notar con este conjunto de datos es que tienen una infinidad de columnas (es un cuestionario largo) por lo cual, la primera tarea como analistas de datos es enfocarnos en seleccionar aquellas variables necesarias para nuestro análisis. En la encuesta tenemos información socioeconómica, sociodemográfica, cultural, etc. No tiene sentido trabajar con todas juntas. Para eso utilizamos la función select() que nos permite realizar una selección de variables o columnas. Vamos a elegir quedarnos con las columnas de información del entrevistado y las columnas que hacen referencia al consumo de radio para poner en prueba esta función.
#Selección de columnas
encuesta_clean <- select(encuesta_cc, id, pondera_dem, fecha, region, sexo, edad, p1, p1otros,
p2, p3, p4, p5, p6horas, p6minutos)
Varias cosas que comentar al respecto. Estamos creando un nuevo conjunto de datos, lo llamamos encuesta_clean para ir guardando las modificaciones que vayamos haciendo. En la función select() lo único que hicimos fue poner el objeto sobre el que se va a correr la función y listar las variables con las que vamos a trabajar. Finalmente nos gustaría mencionar que hay algunas variantes de la función select(), como son select_if() y select_at() que nos permiten realizar selección de variables que cumplen con alguna condición.
filter es una función que retiene un conjunto de observaciones (es lo mismo que decir filas) que cumplen con la condición que indicamos. En pocas palabras, filtramos los casos (unidad de análisis) que cumplen con los requisitos que seleccionamos. Para esto se utilizan los operadores de comparación que vimos en la primera sección. Utilizamos la función filter() para quedarnos con ciertas regiones de nuestro set de datos.
# Primero observamos los campos únicos que tiene la variable region
unique(encuesta_clean$region)
## [1] "CENTRO" "NEA"
## [3] "PATAGONIA" "NOA"
## [5] "CUYO" "CABA"
## [7] "PBA" NA
# Nos vamos a quedar con la región NOA y NEA
encuesta_clean <- filter(encuesta_clean, region %in% c("NOA", "NEA"))
# Inspeccionamos que sean esas dos únicas regiones
unique(encuesta_clean$region)
## [1] "NEA" "NOA"
El operador %in% es la primera vez que lo mencionamos, como pueden imaginarse nos devuelve todos los casos que contengan a su interior algunas de esas opciones. Para complejizar un poco, se puede filtrar por más de una condición. Por ejemplo, queremos analizar los casos de la región NOA pero sólo los del sexo femenino. Recuerden no confundir el & (y) con el | (ó). No es lo mismo decir filtrar las personas que viven en la región NOA y es del sexo femenino que filtrar a las personas que viene en la region NOA o es del sexo femenino.
# Inspeccionamos el valor de sexo
unique(encuesta_clean$sexo)
## [1] "Varón" "Mujer"
#Nos quedamos con los casos de mujeres de NOA
mujeres_noa <- filter(encuesta_clean, region=="NOA" & sexo =="Mujer")
head(mujeres_noa)
## id pondera_dem fecha
## 1 346 3123 8/5/2017
## 2 347 3418 8/5/2017
## 3 348 7784 8/5/2017
## 4 349 5619 8/5/2017
## 5 350 11019 9/5/2017
## 6 356 6363 12/5/2017
## region sexo edad
## 1 NOA Mujer 13
## 2 NOA Mujer 26
## 3 NOA Mujer 38
## 4 NOA Mujer 57
## 5 NOA Mujer 69
## 6 NOA Mujer 13
## p1
## 1 INFORMACION, ESTUDIAR, CONOCER
## 2 LA TRADICION, LA HISTORIA
## 3 LA TRADICION, LA HISTORIA
## 4 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 5 LOS MODALES, EL BUEN COMPORTAMIENTO
## 6 INFORMACION, ESTUDIAR, CONOCER
## p1otros p2 p3 p4 p5
## 1 <NA> NO <NA> <NA> <NA>
## 2 <NA> NO <NA> <NA> <NA>
## 3 <NA> NO <NA> <NA> <NA>
## 4 <NA> NO <NA> <NA> <NA>
## 5 <NA> NO <NA> <NA> <NA>
## 6 <NA> NO <NA> <NA> <NA>
## p6horas p6minutos
## 1 NA NA
## 2 NA NA
## 3 NA NA
## 4 NA NA
## 5 NA NA
## 6 NA NA
También se puede combinar con funciones. Por ejemplo, podemos seleccionar los casos de nuestra tabla cuya cantidad de horas de escucha de radio sea superior al promedio.
#Los que tienen más horas de radio escuchada
mas_promedio <- filter(encuesta_clean, p6horas >= mean(p6horas, na.rm=T))
head(mas_promedio)
## id pondera_dem fecha
## 1 44 9649 20/5/2017
## 2 45 2778 19/5/2017
## 3 49 4415 19/5/2017
## 4 54 1661 17/5/2017
## 5 57 2904 15/5/2017
## 6 62 4393 13/5/2017
## region sexo edad
## 1 NEA Varón 48
## 2 NEA Varón 63
## 3 NEA Mujer 55
## 4 NEA Varón 45
## 5 NEA Mujer 22
## 6 NEA Varón 26
## p1
## 1 EL ARTE, LO CULTO
## 2 INFORMACION, ESTUDIAR, CONOCER
## 3 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 4 INFORMACION, ESTUDIAR, CONOCER
## 5 NS/NC
## 6 EL ARTE, LO CULTO
## p1otros p2 p3
## 1 <NA> SI SI
## 2 <NA> SI NO
## 3 <NA> SI NO
## 4 <NA> SI NO
## 5 <NA> SI NO
## 6 <NA> SI SI
## p4
## 1 ALGUNAS VECES AL MES
## 2 TODOS O CASI TODOS LOS DIAS
## 3 ALGUNAS VECES AL MES
## 4 TODOS O CASI TODOS LOS DIAS
## 5 TODOS O CASI TODOS LOS DIAS
## 6 TODOS O CASI TODOS LOS DIAS
## p5 p6horas p6minutos
## 1 FM 4 0
## 2 FM 3 30
## 3 FM 4 0
## 4 FM 3 0
## 5 FM 4 30
## 6 FM 12 0
Arrange es una de las funciones que permite en R ordenar las filas de una tabla. Por ejemplo, ordenar de menor a mayor nuestra tabla por edad.
# Ordenamos
arrange(encuesta_clean, edad)
## id pondera_dem fecha
## 1 81 2933 19/5/2017
## 2 136 2112 16/5/2017
## 3 346 3123 8/5/2017
## 4 356 6363 12/5/2017
## 5 366 4994 9/5/2017
## 6 376 6079 10/5/2017
## 7 381 3877 14/5/2017
## 8 436 13116 13/5/2017
## 9 446 3940 16/5/2017
## 10 485 10423 28/5/2017
## 11 610 1551 18/5/2017
## 12 811 4595 21/5/2017
## 13 871 6177 23/5/2017
## 14 1061 8278 8/5/2017
## 15 1066 12656 8/5/2017
## 16 1071 6927 7/5/2017
## 17 1351 3094 6/7/2017
## 18 1396 6630 29/5/2017
## 19 1525 2267 8/6/2017
## 20 71 1235 12/5/2017
## 21 76 1309 11/5/2017
## 22 86 6219 19/5/2017
## 23 126 844 12/5/2017
## 24 151 1099 22/5/2017
## 25 166 2932 28/5/2017
## 26 361 6805 9/5/2017
## 27 426 8935 11/5/2017
## 28 496 1818 28/5/2017
## 29 511 3143 27/5/2017
## 30 516 7689 27/5/2017
## 31 531 3486 1/6/2017
## 32 556 6485 28/5/2017
## 33 605 7771 17/5/2017
## 34 616 9483 18/5/2017
## 35 806 8401 20/5/2017
## 36 816 5620 21/5/2017
## 37 941 5729 13/5/2017
## 38 1026 11672 6/5/2017
## 39 1426 5533 6/6/2017
## 40 1431 3686 13/6/2017
## 41 1551 3902 5/6/2017
## 42 56 11621 16/5/2017
## 43 66 4630 16/5/2017
## 44 116 12791 20/5/2017
## 45 161 2765 23/5/2017
## 46 171 7414 22/5/2017
## 47 196 5855 14/5/2017
## 48 201 6893 12/5/2017
## 49 351 5203 12/5/2017
## 50 386 5283 14/5/2017
## 51 411 2058 15/7/2017
## 52 441 6442 16/5/2017
## 53 456 6265 12/5/2017
## 54 461 2444 22/5/2017
## 55 466 1495 22/5/2017
## 56 491 4460 28/5/2017
## 57 501 5901 20/5/2017
## 58 506 5413 20/5/2017
## 59 541 5563 19/5/2017
## 60 626 11533 26/5/2017
## 61 756 12452 24/5/2017
## 62 761 10268 19/5/2017
## 63 801 13737 20/5/2017
## 64 861 5546 22/5/2017
## 65 1011 4946 24/5/2017
## 66 1021 4771 6/5/2017
## 67 1356 2461 6/7/2017
## 68 1366 4280 7/7/2017
## 69 1421 4174 6/6/2017
## 70 1541 5391 11/6/2017
## 71 1550 1429 9/6/2017
## region sexo edad
## 1 NEA Varón 13
## 2 NEA Mujer 13
## 3 NOA Mujer 13
## 4 NOA Mujer 13
## 5 NOA Mujer 13
## 6 NOA Mujer 13
## 7 NOA Mujer 13
## 8 NOA Mujer 13
## 9 NOA Mujer 13
## 10 NOA Mujer 13
## 11 NOA Varón 13
## 12 NOA Varón 13
## 13 NOA Varón 13
## 14 NOA Varón 13
## 15 NOA Mujer 13
## 16 NOA Varón 13
## 17 NEA Varón 13
## 18 NEA Mujer 13
## 19 NEA Mujer 13
## 20 NEA Varón 14
## 21 NEA Mujer 14
## 22 NEA Mujer 14
## 23 NEA Mujer 14
## 24 NEA Varón 14
## 25 NEA Mujer 14
## 26 NOA Varón 14
## 27 NOA Mujer 14
## 28 NOA Mujer 14
## 29 NOA Varón 14
## 30 NOA Mujer 14
## 31 NOA Varón 14
## 32 NOA Mujer 14
## 33 NOA Mujer 14
## 34 NOA Mujer 14
## 35 NOA Mujer 14
## 36 NOA Mujer 14
## 37 NOA Varón 14
## 38 NOA Mujer 14
## 39 NEA Mujer 14
## 40 NEA Varón 14
## 41 NEA Varón 14
## 42 NEA Mujer 15
## 43 NEA Mujer 15
## 44 NEA Mujer 15
## 45 NEA Varón 15
## 46 NEA Varón 15
## 47 NEA Mujer 15
## 48 NEA Varón 15
## 49 NOA Varón 15
## 50 NOA Varón 15
## 51 NOA Varón 15
## 52 NOA Varón 15
## 53 NOA Mujer 15
## 54 NOA Varón 15
## 55 NOA Mujer 15
## 56 NOA Varón 15
## 57 NOA Varón 15
## 58 NOA Mujer 15
## 59 NOA Varón 15
## 60 NOA Mujer 15
## 61 NOA Mujer 15
## 62 NOA Varón 15
## 63 NOA Varón 15
## 64 NOA Varón 15
## 65 NOA Varón 15
## 66 NOA Varón 15
## 67 NEA Mujer 15
## 68 NEA Mujer 15
## 69 NEA Varón 15
## 70 NEA Varón 15
## 71 NEA Mujer 15
## p1
## 1 EL ARTE, LO CULTO
## 2 LA TRADICION, LA HISTORIA
## 3 INFORMACION, ESTUDIAR, CONOCER
## 4 INFORMACION, ESTUDIAR, CONOCER
## 5 INFORMACION, ESTUDIAR, CONOCER
## 6 INFORMACION, ESTUDIAR, CONOCER
## 7 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 8 LA TRADICION, LA HISTORIA
## 9 LA TRADICION, LA HISTORIA
## 10 NS/NC
## 11 LA TRADICION, LA HISTORIA
## 12 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 13 INFORMACION, ESTUDIAR, CONOCER
## 14 NS/NC
## 15 INFORMACION, ESTUDIAR, CONOCER
## 16 NS/NC
## 17 OTRO
## 18 LA IDENTIDAD
## 19 EL ARTE, LO CULTO
## 20 INFORMACION, ESTUDIAR, CONOCER
## 21 EL ARTE, LO CULTO
## 22 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 23 LOS MODALES, EL BUEN COMPORTAMIENTO
## 24 LA TRADICION, LA HISTORIA
## 25 LOS MODALES, EL BUEN COMPORTAMIENTO
## 26 LOS MODALES, EL BUEN COMPORTAMIENTO
## 27 LOS MODALES, EL BUEN COMPORTAMIENTO
## 28 NS/NC
## 29 INFORMACION, ESTUDIAR, CONOCER
## 30 LOS MODALES, EL BUEN COMPORTAMIENTO
## 31 LA TRADICION, LA HISTORIA
## 32 INFORMACION, ESTUDIAR, CONOCER
## 33 LOS MODALES, EL BUEN COMPORTAMIENTO
## 34 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 35 LA TRADICION, LA HISTORIA
## 36 INFORMACION, ESTUDIAR, CONOCER
## 37 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 38 LOS MODALES, EL BUEN COMPORTAMIENTO
## 39 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 40 NS/NC
## 41 INFORMACION, ESTUDIAR, CONOCER
## 42 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 43 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 44 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 45 INFORMACION, ESTUDIAR, CONOCER
## 46 EL ARTE, LO CULTO
## 47 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 48 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 49 LA TRADICION, LA HISTORIA
## 50 LOS MODALES, EL BUEN COMPORTAMIENTO
## 51 LA TRADICION, LA HISTORIA
## 52 LA TRADICION, LA HISTORIA
## 53 LA TRADICION, LA HISTORIA
## 54 NS/NC
## 55 INFORMACION, ESTUDIAR, CONOCER
## 56 LA TRADICION, LA HISTORIA
## 57 EL ARTE, LO CULTO
## 58 NS/NC
## 59 LA TRADICION, LA HISTORIA
## 60 NS/NC
## 61 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 62 NS/NC
## 63 LA TRADICION, LA HISTORIA
## 64 INFORMACION, ESTUDIAR, CONOCER
## 65 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 66 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 67 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## 68 INFORMACION, ESTUDIAR, CONOCER
## 69 LOS MODALES, EL BUEN COMPORTAMIENTO
## 70 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 71 NS/NC
## p1otros p2 p3
## 1 <NA> NO <NA>
## 2 <NA> SI SI
## 3 <NA> NO <NA>
## 4 <NA> NO <NA>
## 5 <NA> NO <NA>
## 6 <NA> NO <NA>
## 7 <NA> NO <NA>
## 8 <NA> NO <NA>
## 9 <NA> NO <NA>
## 10 <NA> SI NO
## 11 <NA> SI SI
## 12 <NA> NO <NA>
## 13 <NA> NO <NA>
## 14 <NA> SI SI
## 15 <NA> NO <NA>
## 16 <NA> NO <NA>
## 17 MONUMENTOS NO <NA>
## 18 <NA> NO <NA>
## 19 <NA> SI NO
## 20 <NA> SI NO
## 21 <NA> SI NO
## 22 <NA> NO <NA>
## 23 <NA> SI NO
## 24 <NA> SI SI
## 25 <NA> NO <NA>
## 26 <NA> NO <NA>
## 27 <NA> NO <NA>
## 28 <NA> SI NO
## 29 <NA> NO <NA>
## 30 <NA> NO <NA>
## 31 <NA> NO <NA>
## 32 <NA> NO <NA>
## 33 <NA> NO <NA>
## 34 <NA> NO <NA>
## 35 <NA> NO <NA>
## 36 <NA> NO <NA>
## 37 <NA> NO <NA>
## 38 <NA> SI NO
## 39 <NA> NO <NA>
## 40 <NA> NO <NA>
## 41 <NA> NO <NA>
## 42 <NA> NO <NA>
## 43 <NA> NO <NA>
## 44 <NA> SI NO
## 45 <NA> NO <NA>
## 46 <NA> NO <NA>
## 47 <NA> SI NO
## 48 <NA> NO <NA>
## 49 <NA> NO <NA>
## 50 <NA> NO <NA>
## 51 <NA> SI NO
## 52 <NA> NO <NA>
## 53 <NA> SI NO
## 54 <NA> NO <NA>
## 55 <NA> NO <NA>
## 56 <NA> NO <NA>
## 57 <NA> SI SI
## 58 <NA> NO <NA>
## 59 <NA> NO <NA>
## 60 <NA> NO <NA>
## 61 <NA> NO <NA>
## 62 <NA> NO <NA>
## 63 <NA> SI NO
## 64 <NA> NO <NA>
## 65 <NA> NO <NA>
## 66 <NA> NO <NA>
## 67 <NA> SI SI
## 68 <NA> SI SI
## 69 <NA> SI NO
## 70 <NA> NO <NA>
## 71 <NA> NO <NA>
## p4
## 1 <NA>
## 2 ALGUNOS DIAS POR SEMANA
## 3 <NA>
## 4 <NA>
## 5 <NA>
## 6 <NA>
## 7 <NA>
## 8 <NA>
## 9 <NA>
## 10 TODOS O CASI TODOS LOS DIAS
## 11 ALGUNAS VECES AL MES
## 12 <NA>
## 13 <NA>
## 14 TODOS O CASI TODOS LOS DIAS
## 15 <NA>
## 16 <NA>
## 17 <NA>
## 18 <NA>
## 19 TODOS O CASI TODOS LOS DIAS
## 20 TODOS O CASI TODOS LOS DIAS
## 21 ALGUNAS VECES AL MES
## 22 <NA>
## 23 ALGUNAS VECES AL MES
## 24 ALGUNAS VECES AL MES
## 25 <NA>
## 26 <NA>
## 27 <NA>
## 28 TODOS O CASI TODOS LOS DIAS
## 29 <NA>
## 30 <NA>
## 31 <NA>
## 32 <NA>
## 33 <NA>
## 34 <NA>
## 35 <NA>
## 36 <NA>
## 37 <NA>
## 38 ALGUNOS DIAS POR SEMANA
## 39 <NA>
## 40 <NA>
## 41 <NA>
## 42 <NA>
## 43 <NA>
## 44 ALGUNOS DIAS POR SEMANA
## 45 <NA>
## 46 <NA>
## 47 TODOS O CASI TODOS LOS DIAS
## 48 <NA>
## 49 <NA>
## 50 <NA>
## 51 ALGUNAS VECES AL MES
## 52 <NA>
## 53 ALGUNOS DIAS POR SEMANA
## 54 <NA>
## 55 <NA>
## 56 <NA>
## 57 ALGUNOS DIAS POR SEMANA
## 58 <NA>
## 59 <NA>
## 60 <NA>
## 61 <NA>
## 62 <NA>
## 63 TODOS O CASI TODOS LOS DIAS
## 64 <NA>
## 65 <NA>
## 66 <NA>
## 67 TODOS O CASI TODOS LOS DIAS
## 68 TODOS O CASI TODOS LOS DIAS
## 69 ALGUNOS DIAS POR SEMANA
## 70 <NA>
## 71 <NA>
## p5 p6horas
## 1 <NA> NA
## 2 FM 2
## 3 <NA> NA
## 4 <NA> NA
## 5 <NA> NA
## 6 <NA> NA
## 7 <NA> NA
## 8 <NA> NA
## 9 <NA> NA
## 10 FM 1
## 11 AMBAS POR IGUAL 1
## 12 <NA> NA
## 13 <NA> NA
## 14 FM 1
## 15 <NA> NA
## 16 <NA> NA
## 17 <NA> NA
## 18 <NA> NA
## 19 AM 2
## 20 FM 1
## 21 FM 1
## 22 <NA> NA
## 23 NS/NC 1
## 24 FM 0
## 25 <NA> NA
## 26 <NA> NA
## 27 <NA> NA
## 28 FM 4
## 29 <NA> NA
## 30 <NA> NA
## 31 <NA> NA
## 32 <NA> NA
## 33 <NA> NA
## 34 <NA> NA
## 35 <NA> NA
## 36 <NA> NA
## 37 <NA> NA
## 38 FM 1
## 39 <NA> NA
## 40 <NA> NA
## 41 <NA> NA
## 42 <NA> NA
## 43 <NA> NA
## 44 FM 1
## 45 <NA> NA
## 46 <NA> NA
## 47 AMBAS POR IGUAL 10
## 48 <NA> NA
## 49 <NA> NA
## 50 <NA> NA
## 51 FM 0
## 52 <NA> NA
## 53 FM 1
## 54 <NA> NA
## 55 <NA> NA
## 56 <NA> NA
## 57 NS/NC 0
## 58 <NA> NA
## 59 <NA> NA
## 60 <NA> NA
## 61 <NA> NA
## 62 <NA> NA
## 63 AMBAS POR IGUAL 0
## 64 <NA> NA
## 65 <NA> NA
## 66 <NA> NA
## 67 FM 3
## 68 AM 2
## 69 FM 2
## 70 <NA> NA
## 71 <NA> NA
## p6minutos
## 1 NA
## 2 0
## 3 NA
## 4 NA
## 5 NA
## 6 NA
## 7 NA
## 8 NA
## 9 NA
## 10 0
## 11 0
## 12 NA
## 13 NA
## 14 0
## 15 NA
## 16 NA
## 17 NA
## 18 NA
## 19 0
## 20 0
## 21 0
## 22 NA
## 23 0
## 24 40
## 25 NA
## 26 NA
## 27 NA
## 28 0
## 29 NA
## 30 NA
## 31 NA
## 32 NA
## 33 NA
## 34 NA
## 35 NA
## 36 NA
## 37 NA
## 38 0
## 39 NA
## 40 NA
## 41 NA
## 42 NA
## 43 NA
## 44 0
## 45 NA
## 46 NA
## 47 0
## 48 NA
## 49 NA
## 50 NA
## 51 20
## 52 NA
## 53 0
## 54 NA
## 55 NA
## 56 NA
## 57 30
## 58 NA
## 59 NA
## 60 NA
## 61 NA
## 62 NA
## 63 30
## 64 NA
## 65 NA
## 66 NA
## 67 0
## 68 0
## 69 0
## 70 NA
## 71 NA
## [ reached 'max' / getOption("max.print") -- omitted 729 rows ]
Si agregamos la función desc() podemos invertir el orden.
# Ordenamos de manera descendente
encuesta_clean %>%
arrange(desc(edad)) %>%
head()
## id pondera_dem fecha
## 1 1560 3873 5/6/2017
## 2 1360 1197 5/7/2017
## 3 1030 5055 6/5/2017
## 4 1436 3637 13/6/2017
## 5 70 6501 12/5/2017
## 6 185 1874 13/5/2017
## region sexo edad
## 1 NEA Mujer 92
## 2 NEA Mujer 89
## 3 NOA Mujer 88
## 4 NEA Varón 87
## 5 NEA Mujer 86
## 6 NEA Varón 84
## p1
## 1 LA TRADICION, LA HISTORIA
## 2 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 3 LA TRADICION, LA HISTORIA
## 4 HABITOS, COSTUMBRES, COMPORTAMIENTOS
## 5 EL ARTE, LO CULTO
## 6 LA FORMA DE PENSAR, IDEOLOGIA, VALORES
## p1otros p2 p3
## 1 <NA> NO <NA>
## 2 <NA> SI NO
## 3 <NA> NO <NA>
## 4 <NA> SI NO
## 5 <NA> NO <NA>
## 6 <NA> SI NO
## p4
## 1 <NA>
## 2 ALGUNOS DIAS POR SEMANA
## 3 <NA>
## 4 TODOS O CASI TODOS LOS DIAS
## 5 <NA>
## 6 TODOS O CASI TODOS LOS DIAS
## p5 p6horas
## 1 <NA> NA
## 2 AMBAS POR IGUAL 6
## 3 <NA> NA
## 4 AMBAS POR IGUAL 4
## 5 <NA> NA
## 6 FM 1
## p6minutos
## 1 NA
## 2 0
## 3 NA
## 4 30
## 5 NA
## 6 0
Summarise nos permite aplicar un resumen o calcular un indicador que sintetice la información de una o varias variables del dataframe. Una medida de resumen puede saber la cantidad de personas encuestadas y el universo de personas (utilizando la ponderación). Recuerden que esta encuesta es una muestra (personas que responden la encuesta) de tipo probabilística. Esto quiere decir que usando la ponderación podemos extrapolar los resultados al universo.
#Cantidad de personas pr región y sexo
tabla_cantidad <- summarise(encuesta_clean,
Personas = sum(pondera_dem),
cantidad_de_casos = n())
tabla_cantidad
## Personas cantidad_de_casos
## 1 4864089 800
Como estamos trabajando con una encuesta, para saber la cantidad de personas que forman parte del universo tenemos que sumar la variable de ponderación, en este caso es pondera_dem. Además, creamos la variable cantidad_de_casos, nos sirve para saber cuántas respuestas respondieron la encuesta usando la función n() (que no es para nada intuitivo).
Summarise podemos combinarla con una función increíble (que también se combina con mutate y otras funciones) que es group_by. En este caso, vamos a agrupar por región y sexo para hacer los conteos de personas que forman parte de la muestra y del universo por grupo. Por ejemplo, va a realizar los cálculos que vimos previamente de las mujeres que son del NEA, mujeres que son del NOA, varones que son del NEA, y varones que son del NOA. Veamos el código y el output que genera:
tabla_cantidad <- group_by(encuesta_clean, sexo, region)
tabla_resumen <- summarise(tabla_cantidad,
Personas = sum(pondera_dem),
cantidad_de_casos = n())
tabla_resumen
## # A tibble: 4 x 4
## # Groups: sexo [2]
## sexo region Personas
## <chr> <chr> <dbl>
## 1 Mujer NEA 979450
## 2 Mujer NOA 1552643
## 3 Varón NEA 897181
## 4 Varón NOA 1434815
## # ... with 1 more variable:
## # cantidad_de_casos <int>
También podríamos realizar esto mismo de manera más sencilla aplicando el count(). Pero la idea era presentarles la combinación de estás hermosas funciones. Veamos cómo se realiza con el count():
tabla_cantidad <- group_by(encuesta_clean, sexo, region)
tabla_cantidad <- summarise(tabla_cantidad,
Personas = sum(pondera_dem),
cantidad_de_casos = n())
tabla_cantidad
## # A tibble: 4 x 4
## # Groups: sexo [2]
## sexo region Personas
## <chr> <chr> <dbl>
## 1 Mujer NEA 979450
## 2 Mujer NOA 1552643
## 3 Varón NEA 897181
## 4 Varón NOA 1434815
## # ... with 1 more variable:
## # cantidad_de_casos <int>
La última función que vamos a ver de dplyr es súper, súper, súper necesaria. mutate nos permite hacer dos cosas fundamentales: modificar variables existentes y crear nuevas. La sintaxis es igual a como venimos trabajando. Vamos a crear dos variables en base a la edad. En primer lugar, vamos a crear una variable que identifique si la persona es menor de edad o no, y en segundo lugar vamos a crear una variable de edad, pero con rangos. Nos vamos a apoyar en dos funciones más ifelse() y case_when(), para llevar adelante esta tarea.
# Creamos dos variables en base a la edad
encuesta_clean <- encuesta_clean %>%
mutate( flag_menor = ifelse( edad>=18, 'mayor de edad', 'menor de edad'),
edad_categorica = case_when(
edad <= 30 ~ '30 o menos',
edad > 30 & edad <= 45 ~ '31 a 45',
edad > 45 & edad <= 60 ~ '46 a 60',
edad > 60 & edad <= 75 ~ '61 a 75',
edad > 75 ~ '76 o más',
TRUE ~ "Sin edad"
) )
Las dos líneas son muy parecidas, sólo que en ifelse() evalúa una condición, si se cumple devuelve la primera expresión si no se cumple la otra. Con case_when() en cambio evaluamos múltiples condiciones y para cada una el resultado que queremos. Es muy importante tener en cuenta que las condiciones es preferible que sean excluyentes, es decir, que no haya posibilidad de que se cumpla dos veces. Si no lo hacemos así, lo que va a ocurrir es que se va a aplicar la primera condición que sea verdadera. Como con select() aquí también tenemos variantes como el mutate_if() y mutate_at. Es muy útil para cuando necesitamos aplicar una misma transformación a una serie de columnas. Por ejemplo, si queremos pasar un tipo de dato entero a todas las variables que son double, lo podemos hacer muy fácilmente con mutate_if.
# Convertimos a entero todas las variables que son double
encuesta_clean %>%
mutate_if(is.double, as.integer) %>%
head()
## id pondera_dem fecha
## 1 41 9283 20/5/2017
## 2 42 9280 20/5/2017
## 3 43 1608 19/5/2017
## 4 44 9649 20/5/2017
## 5 45 2778 19/5/2017
## 6 46 5623 19/5/2017
## region sexo edad
## 1 NEA Varón 17
## 2 NEA Varón 24
## 3 NEA Varón 35
## 4 NEA Varón 48
## 5 NEA Varón 63
## 6 NEA Mujer 19
## p1
## 1 LA TRADICION, LA HISTORIA
## 2 INFORMACION, ESTUDIAR, CONOCER
## 3 LA TRADICION, LA HISTORIA
## 4 EL ARTE, LO CULTO
## 5 INFORMACION, ESTUDIAR, CONOCER
## 6 INFORMACION, ESTUDIAR, CONOCER
## p1otros p2 p3
## 1 <NA> SI SI
## 2 <NA> SI NO
## 3 <NA> SI NO
## 4 <NA> SI SI
## 5 <NA> SI NO
## 6 <NA> SI SI
## p4
## 1 TODOS O CASI TODOS LOS DIAS
## 2 TODOS O CASI TODOS LOS DIAS
## 3 ALGUNAS VECES AL MES
## 4 ALGUNAS VECES AL MES
## 5 TODOS O CASI TODOS LOS DIAS
## 6 ALGUNAS VECES AL MES
## p5 p6horas p6minutos
## 1 FM 2 0
## 2 FM 2 0
## 3 FM 2 0
## 4 FM 4 0
## 5 FM 3 30
## 6 AM 1 0
## flag_menor
## 1 menor de edad
## 2 mayor de edad
## 3 mayor de edad
## 4 mayor de edad
## 5 mayor de edad
## 6 mayor de edad
## edad_categorica
## 1 30 o menos
## 2 30 o menos
## 3 31 a 45
## 4 46 a 60
## 5 61 a 75
## 6 30 o menos
Muchas veces, tenemos dos o más tablas que comparten entre sí una identificación común. Por ejemplo, imaginemos que estamos trabajando como hicimos antes con un gráfico de las comunas de capital federal y queremos graficar la cantidad de casos de COVID por comuna. En general vamos a tener una tabla con la geografía de las comunas y en la otra tabla una con los casos de COVID por cada una. Para realizar el gráfico vamos a tener que unificarlas.
Hay distintos tipos de joins, los más comunes son left_join() e inner_join(). La diferencia entre ellos es que el primero, deja todos los casos de una tabla de referencia (la de la izquierda) y le va pegando todos los casos que encuentra por la columna que comparten de la tabla de la derecha. Si tenemos un caso en la tabla izquierda que no está en la derecha igual lo vamos a visualizar. La función de inner_join() sólo nos va a devolver como resultado los casos que encuentre en ambas tablas.
# Ejemplo de joins
# Notas de sociales
notas_soc <- data.frame(id_alumnes = LETTERS[1:5],
notas_soc = c(10, 8, 9, 5, 9))
# Las notas de matematica
notas_mat <- data.frame(id_alumnes = LETTERS[1:3],
notas_mat = c(8, 9, 7))
# Left join
notas_soc%>%
left_join(notas_mat, by = c("id_alumnes"="id_alumnes"))
## id_alumnes notas_soc
## 1 A 10
## 2 B 8
## 3 C 9
## 4 D 5
## 5 E 9
## notas_mat
## 1 8
## 2 9
## 3 7
## 4 NA
## 5 NA
# Inner join
notas_soc %>%
inner_join(notas_mat, by = c("id_alumnes"="id_alumnes"))
## id_alumnes notas_soc
## 1 A 10
## 2 B 8
## 3 C 9
## notas_mat
## 1 8
## 2 9
## 3 7
La unificación de bases de datos, o tablas, puede realizarse con otras funciones, otras variantes son right_join() y full_join(), si quieren aprender más de joins y de forma interactiva no se pierdan de este link .
Si hay algo súper novedoso y útil que introdujo tydiverse en el mundo de R la función pipe, que no es más ni menos que otro operador, cuyo símbolo es el siguiente: %>%. Lo que nos permite el Pipe de R es concatenar funciones de una manera mucho más legible que con R base. Sabemos que suena chino básico, pero con la práctica termina resultando híper amigable. Nosotros decimos que el pipe es como “una línea de montaje”. Esto quiere decir que cada línea de código aplica una transformación al objeto (que estamos trabajando) pero teniendo en cuenta la modificación previa. Esto nos va a permitir ahorrarnos unas cuantas líneas de texto y mejorar la legibilidad del código. Veamos un ejemplo práctico con la encuesta de consumos culturales con la que veníamos trabajando:
En un mismo código planteamos: 1- Seleccionar las variables: id, pondera_dem, fecha, region, sexo 2- Filtrar región NOA y NEA 3- Agrupamos por región y contamos cuántas personas respondieron la encuesta
encuesta_cc %>%
select(id, pondera_dem, fecha, region, sexo) %>%
filter(region %in% c("NOA", "NEA")) %>%
group_by(region, sexo) %>%
summarise(Personas = sum(pondera_dem),
cantidad_de_casos = n())
## # A tibble: 4 x 4
## # Groups: region [2]
## region sexo Personas
## <chr> <chr> <dbl>
## 1 NEA Mujer 979450
## 2 NEA Varón 897181
## 3 NOA Mujer 1552643
## 4 NOA Varón 1434815
## # ... with 1 more variable:
## # cantidad_de_casos <int>
En pocas palabras, cada línea de código adiciona una transformación sobre la tabla. Por esto decíamos que el pipe, funciona como una línea de montaje: cada línea de código agrega una modificación del objeto con el que se está trabajando. Al pipe también se lo conoce como las tuberías de r.
Otra biblioteca dentro del paradigma de Tidyverse es tidyr. La misma nos permite realizar otro tipo de transformaciones que pueden resultar de ayuda. Más adelante, veremos en aplicaciones prácticas separete() y unite() que como sus nombres lo indican nos permiten separar columnas por algún patrón y también unir columnas.
Encontramos en este paquete otras dos funciones que queremos que conozcan porque si o si las van a usar en algún momento, sobre todo a la hora de graficar. Estas son pivot_longer() y pivot_wider(). Cada vez que la usamos, le pegamos una ojeada al machete que nos provee R ejecutando:
# Recurrimos a la documentación para ver cómo funcionan las funciones
?pivot_wider
?pivot_longer
pivot_wider() incrementa el número de columnas y reduce el número de filas. Veamos un ejemplo con la tabla resumen que hicimos más arriba.
# Aplicamos la transformación con pivot_wider
tabla_wider <- tabla_resumen %>%
pivot_wider(names_from = sexo,
values_from = Personas)
tabla_wider
## # A tibble: 4 x 4
## region cantidad_de_casos
## <chr> <int>
## 1 NEA 201
## 2 NOA 201
## 3 NEA 199
## 4 NOA 199
## # ... with 2 more variables:
## # Mujer <dbl>, Varón <dbl>
Convertimos cada categoría de sexo en una nueva columna y los valores que llenan cada columna son los de cantidad de personas. Ahora nuestra tabla resumen tiene otro aspecto.
El caso de pivot_longer() incrementa el número de filas y reduce el nombre de columnas.
# Vovemos a convertir al formato original la tabla
tabla_longer <- tabla_wider %>%
pivot_longer(cols = -region,
names_to = "sexo2",
values_to = "Personas",
values_drop_na = TRUE)
tabla_longer
## # A tibble: 8 x 3
## region sexo2 Personas
## <chr> <chr> <dbl>
## 1 NEA cantidad_de~ 201
## 2 NEA Mujer 979450
## 3 NOA cantidad_de~ 201
## 4 NOA Mujer 1552643
## 5 NEA cantidad_de~ 199
## 6 NEA Varón 897181
## 7 NOA cantidad_de~ 199
## 8 NOA Varón 1434815
Queremos incorporar a nuestra caja de herramienta unas poquitas funciones más para trabajar con fechas. lubridate nos provee una serie de herramientas para crear objetos fechas y manipularlos. Si miramos la tabla con la que venimos trabajando van a encontrar una columna fecha, pero el tipo de dato que contiene es carácter, es decir que R lo está leyendo como texto. Esta puede ser incómodo para realizar algunas funciones temporales como contar los días transcurridos entre una fecha y la otra, o simplemente filtrar información. Vamos a un ejemplo:
# Veamos algunas funciones de lubridate
library(lubridate)
tabla_con_fechas <- encuesta_clean %>%
select(id, fecha) %>%
mutate(fecha2 = dmy(fecha)) %>% # Creamos un objeto fecha
mutate(anio = year(fecha2),
mes = month(fecha2),
dia = day(fecha2),
dias_transcurridos = (Sys.Date() - fecha2) )
tabla_con_fechas
## id fecha fecha2
## 1 41 20/5/2017 2017-05-20
## 2 42 20/5/2017 2017-05-20
## 3 43 19/5/2017 2017-05-19
## 4 44 20/5/2017 2017-05-20
## 5 45 19/5/2017 2017-05-19
## 6 46 19/5/2017 2017-05-19
## 7 47 19/5/2017 2017-05-19
## 8 48 19/5/2017 2017-05-19
## 9 49 19/5/2017 2017-05-19
## 10 50 19/5/2017 2017-05-19
## 11 51 15/5/2017 2017-05-15
## 12 52 16/5/2017 2017-05-16
## 13 53 16/5/2017 2017-05-16
## 14 54 17/5/2017 2017-05-17
## 15 55 16/5/2017 2017-05-16
## 16 56 16/5/2017 2017-05-16
## 17 57 15/5/2017 2017-05-15
## 18 58 15/5/2017 2017-05-15
## 19 59 15/5/2017 2017-05-15
## 20 60 15/5/2017 2017-05-15
## 21 61 16/5/2017 2017-05-16
## 22 62 13/5/2017 2017-05-13
## 23 63 12/5/2017 2017-05-12
## 24 64 13/5/2017 2017-05-13
## 25 65 13/5/2017 2017-05-13
## 26 66 16/5/2017 2017-05-16
## 27 67 12/5/2017 2017-05-12
## 28 68 13/5/2017 2017-05-13
## 29 69 16/5/2017 2017-05-16
## 30 70 12/5/2017 2017-05-12
## 31 71 12/5/2017 2017-05-12
## 32 72 12/5/2017 2017-05-12
## 33 73 11/5/2017 2017-05-11
## 34 74 11/5/2017 2017-05-11
## 35 75 11/5/2017 2017-05-11
## 36 76 11/5/2017 2017-05-11
## 37 77 12/5/2017 2017-05-12
## 38 78 12/5/2017 2017-05-12
## 39 79 11/5/2017 2017-05-11
## 40 80 12/5/2017 2017-05-12
## 41 81 19/5/2017 2017-05-19
## 42 82 19/5/2017 2017-05-19
## 43 83 19/5/2017 2017-05-19
## 44 84 19/5/2017 2017-05-19
## 45 85 19/5/2017 2017-05-19
## 46 86 19/5/2017 2017-05-19
## 47 87 19/5/2017 2017-05-19
## 48 88 19/5/2017 2017-05-19
## 49 89 19/5/2017 2017-05-19
## 50 90 19/5/2017 2017-05-19
## 51 91 22/5/2017 2017-05-22
## 52 92 22/5/2017 2017-05-22
## 53 93 22/5/2017 2017-05-22
## 54 94 22/5/2017 2017-05-22
## 55 95 22/5/2017 2017-05-22
## 56 96 22/5/2017 2017-05-22
## 57 97 22/5/2017 2017-05-22
## 58 98 22/5/2017 2017-05-22
## 59 99 22/5/2017 2017-05-22
## 60 100 22/5/2017 2017-05-22
## 61 101 20/5/2017 2017-05-20
## 62 102 20/5/2017 2017-05-20
## 63 103 20/5/2017 2017-05-20
## 64 104 25/5/2017 2017-05-25
## 65 105 20/5/2017 2017-05-20
## 66 106 20/5/2017 2017-05-20
## 67 107 20/5/2017 2017-05-20
## 68 108 20/5/2017 2017-05-20
## 69 109 20/5/2017 2017-05-20
## 70 110 20/5/2017 2017-05-20
## 71 111 20/5/2017 2017-05-20
## 72 112 20/5/2017 2017-05-20
## 73 113 20/5/2017 2017-05-20
## 74 114 20/5/2017 2017-05-20
## 75 115 20/5/2017 2017-05-20
## 76 116 20/5/2017 2017-05-20
## 77 117 20/5/2017 2017-05-20
## 78 118 20/5/2017 2017-05-20
## 79 119 20/5/2017 2017-05-20
## 80 120 20/5/2017 2017-05-20
## 81 121 12/5/2017 2017-05-12
## 82 122 15/5/2017 2017-05-15
## 83 123 15/5/2017 2017-05-15
## 84 124 15/5/2017 2017-05-15
## 85 125 14/5/2017 2017-05-14
## 86 126 12/5/2017 2017-05-12
## 87 127 15/5/2017 2017-05-15
## 88 128 14/5/2017 2017-05-14
## 89 129 10/5/2017 2017-05-10
## 90 130 10/5/2017 2017-05-10
## 91 131 16/5/2017 2017-05-16
## 92 132 16/5/2017 2017-05-16
## 93 133 16/5/2017 2017-05-16
## 94 134 14/5/2017 2017-05-14
## 95 135 15/5/2017 2017-05-15
## 96 136 16/5/2017 2017-05-16
## 97 137 15/5/2017 2017-05-15
## 98 138 15/5/2017 2017-05-15
## 99 139 8/5/2017 2017-05-08
## 100 140 15/5/2017 2017-05-15
## 101 141 17/5/2017 2017-05-17
## 102 142 19/5/2017 2017-05-19
## 103 143 12/5/2017 2017-05-12
## 104 144 17/5/2017 2017-05-17
## 105 145 19/5/2017 2017-05-19
## 106 146 17/5/2017 2017-05-17
## 107 147 17/5/2017 2017-05-17
## 108 148 17/5/2017 2017-05-17
## 109 149 16/5/2017 2017-05-16
## 110 150 17/5/2017 2017-05-17
## 111 151 22/5/2017 2017-05-22
## 112 152 21/5/2017 2017-05-21
## 113 153 22/5/2017 2017-05-22
## 114 154 22/5/2017 2017-05-22
## 115 155 21/5/2017 2017-05-21
## 116 156 21/5/2017 2017-05-21
## 117 157 21/5/2017 2017-05-21
## 118 158 21/5/2017 2017-05-21
## 119 159 21/5/2017 2017-05-21
## 120 160 22/5/2017 2017-05-22
## 121 161 23/5/2017 2017-05-23
## 122 162 23/5/2017 2017-05-23
## 123 163 24/5/2017 2017-05-24
## 124 164 24/5/2017 2017-05-24
## 125 165 23/5/2017 2017-05-23
## 126 166 28/5/2017 2017-05-28
## 127 167 23/5/2017 2017-05-23
## 128 168 24/5/2017 2017-05-24
## 129 169 24/5/2017 2017-05-24
## 130 170 23/5/2017 2017-05-23
## 131 171 22/5/2017 2017-05-22
## 132 172 22/5/2017 2017-05-22
## 133 173 22/5/2017 2017-05-22
## 134 174 22/5/2017 2017-05-22
## 135 175 22/5/2017 2017-05-22
## 136 176 22/5/2017 2017-05-22
## 137 177 22/5/2017 2017-05-22
## 138 178 22/5/2017 2017-05-22
## 139 179 22/5/2017 2017-05-22
## 140 180 22/5/2017 2017-05-22
## 141 181 7/5/2017 2017-05-07
## 142 182 7/5/2017 2017-05-07
## anio mes dia
## 1 2017 5 20
## 2 2017 5 20
## 3 2017 5 19
## 4 2017 5 20
## 5 2017 5 19
## 6 2017 5 19
## 7 2017 5 19
## 8 2017 5 19
## 9 2017 5 19
## 10 2017 5 19
## 11 2017 5 15
## 12 2017 5 16
## 13 2017 5 16
## 14 2017 5 17
## 15 2017 5 16
## 16 2017 5 16
## 17 2017 5 15
## 18 2017 5 15
## 19 2017 5 15
## 20 2017 5 15
## 21 2017 5 16
## 22 2017 5 13
## 23 2017 5 12
## 24 2017 5 13
## 25 2017 5 13
## 26 2017 5 16
## 27 2017 5 12
## 28 2017 5 13
## 29 2017 5 16
## 30 2017 5 12
## 31 2017 5 12
## 32 2017 5 12
## 33 2017 5 11
## 34 2017 5 11
## 35 2017 5 11
## 36 2017 5 11
## 37 2017 5 12
## 38 2017 5 12
## 39 2017 5 11
## 40 2017 5 12
## 41 2017 5 19
## 42 2017 5 19
## 43 2017 5 19
## 44 2017 5 19
## 45 2017 5 19
## 46 2017 5 19
## 47 2017 5 19
## 48 2017 5 19
## 49 2017 5 19
## 50 2017 5 19
## 51 2017 5 22
## 52 2017 5 22
## 53 2017 5 22
## 54 2017 5 22
## 55 2017 5 22
## 56 2017 5 22
## 57 2017 5 22
## 58 2017 5 22
## 59 2017 5 22
## 60 2017 5 22
## 61 2017 5 20
## 62 2017 5 20
## 63 2017 5 20
## 64 2017 5 25
## 65 2017 5 20
## 66 2017 5 20
## 67 2017 5 20
## 68 2017 5 20
## 69 2017 5 20
## 70 2017 5 20
## 71 2017 5 20
## 72 2017 5 20
## 73 2017 5 20
## 74 2017 5 20
## 75 2017 5 20
## 76 2017 5 20
## 77 2017 5 20
## 78 2017 5 20
## 79 2017 5 20
## 80 2017 5 20
## 81 2017 5 12
## 82 2017 5 15
## 83 2017 5 15
## 84 2017 5 15
## 85 2017 5 14
## 86 2017 5 12
## 87 2017 5 15
## 88 2017 5 14
## 89 2017 5 10
## 90 2017 5 10
## 91 2017 5 16
## 92 2017 5 16
## 93 2017 5 16
## 94 2017 5 14
## 95 2017 5 15
## 96 2017 5 16
## 97 2017 5 15
## 98 2017 5 15
## 99 2017 5 8
## 100 2017 5 15
## 101 2017 5 17
## 102 2017 5 19
## 103 2017 5 12
## 104 2017 5 17
## 105 2017 5 19
## 106 2017 5 17
## 107 2017 5 17
## 108 2017 5 17
## 109 2017 5 16
## 110 2017 5 17
## 111 2017 5 22
## 112 2017 5 21
## 113 2017 5 22
## 114 2017 5 22
## 115 2017 5 21
## 116 2017 5 21
## 117 2017 5 21
## 118 2017 5 21
## 119 2017 5 21
## 120 2017 5 22
## 121 2017 5 23
## 122 2017 5 23
## 123 2017 5 24
## 124 2017 5 24
## 125 2017 5 23
## 126 2017 5 28
## 127 2017 5 23
## 128 2017 5 24
## 129 2017 5 24
## 130 2017 5 23
## 131 2017 5 22
## 132 2017 5 22
## 133 2017 5 22
## 134 2017 5 22
## 135 2017 5 22
## 136 2017 5 22
## 137 2017 5 22
## 138 2017 5 22
## 139 2017 5 22
## 140 2017 5 22
## 141 2017 5 7
## 142 2017 5 7
## dias_transcurridos
## 1 1733 days
## 2 1733 days
## 3 1734 days
## 4 1733 days
## 5 1734 days
## 6 1734 days
## 7 1734 days
## 8 1734 days
## 9 1734 days
## 10 1734 days
## 11 1738 days
## 12 1737 days
## 13 1737 days
## 14 1736 days
## 15 1737 days
## 16 1737 days
## 17 1738 days
## 18 1738 days
## 19 1738 days
## 20 1738 days
## 21 1737 days
## 22 1740 days
## 23 1741 days
## 24 1740 days
## 25 1740 days
## 26 1737 days
## 27 1741 days
## 28 1740 days
## 29 1737 days
## 30 1741 days
## 31 1741 days
## 32 1741 days
## 33 1742 days
## 34 1742 days
## 35 1742 days
## 36 1742 days
## 37 1741 days
## 38 1741 days
## 39 1742 days
## 40 1741 days
## 41 1734 days
## 42 1734 days
## 43 1734 days
## 44 1734 days
## 45 1734 days
## 46 1734 days
## 47 1734 days
## 48 1734 days
## 49 1734 days
## 50 1734 days
## 51 1731 days
## 52 1731 days
## 53 1731 days
## 54 1731 days
## 55 1731 days
## 56 1731 days
## 57 1731 days
## 58 1731 days
## 59 1731 days
## 60 1731 days
## 61 1733 days
## 62 1733 days
## 63 1733 days
## 64 1728 days
## 65 1733 days
## 66 1733 days
## 67 1733 days
## 68 1733 days
## 69 1733 days
## 70 1733 days
## 71 1733 days
## 72 1733 days
## 73 1733 days
## 74 1733 days
## 75 1733 days
## 76 1733 days
## 77 1733 days
## 78 1733 days
## 79 1733 days
## 80 1733 days
## 81 1741 days
## 82 1738 days
## 83 1738 days
## 84 1738 days
## 85 1739 days
## 86 1741 days
## 87 1738 days
## 88 1739 days
## 89 1743 days
## 90 1743 days
## 91 1737 days
## 92 1737 days
## 93 1737 days
## 94 1739 days
## 95 1738 days
## 96 1737 days
## 97 1738 days
## 98 1738 days
## 99 1745 days
## 100 1738 days
## 101 1736 days
## 102 1734 days
## 103 1741 days
## 104 1736 days
## 105 1734 days
## 106 1736 days
## 107 1736 days
## 108 1736 days
## 109 1737 days
## 110 1736 days
## 111 1731 days
## 112 1732 days
## 113 1731 days
## 114 1731 days
## 115 1732 days
## 116 1732 days
## 117 1732 days
## 118 1732 days
## 119 1732 days
## 120 1731 days
## 121 1730 days
## 122 1730 days
## 123 1729 days
## 124 1729 days
## 125 1730 days
## 126 1725 days
## 127 1730 days
## 128 1729 days
## 129 1729 days
## 130 1730 days
## 131 1731 days
## 132 1731 days
## 133 1731 days
## 134 1731 days
## 135 1731 days
## 136 1731 days
## 137 1731 days
## 138 1731 days
## 139 1731 days
## 140 1731 days
## 141 1746 days
## 142 1746 days
## [ reached 'max' / getOption("max.print") -- omitted 658 rows ]
Utilizamos dmy() que no es más que la forma que traía nuestro formato fecha anterior, estaba el día, el mes y el año. En la biblioteca tenemos todas las combinaciones, incluyendo las horas, los minutos y segundos si los tuviéramos, es súper intuitivo. También creamos unas columnas con el año, el mes y el día, e hicimos un pequeño cálculo de fechas comparando la fecha actual (del día que se ejecute) Sys.Date() y le restamos la fecha de realización de la encuesta. Esto último no lo podríamos hacer con una columna de tipo texto.
stringr nos abre las puertas al fabuloso mundo de la manipulación de texto, que no exageramos, es un mundo. Entre otras cosas nos permite trabajar con expresiones regulares para detectar, eliminar, reemplazar, contar patrones en nuestros textos. Dejamos dos enlaces para ampliar sobre estos tópicos [aquí] (https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular) y para descargar el Cheatsheet de Regex aquí.
library(stringr)
texto = "Vamos a trabajar con un texto creado para estos ejemplos,
recuerden que podemos hacer casi las mismas cosas para cada fila de una columna.
Acá voy a poner unos números para usar de ejemplo; 123498-537"
# Pedimos el largo de una cadena
str_length(texto)
## [1] 201
# Contamos un patron
str_count(string = texto, pattern = "[0-9]") # contamos números
## [1] 9
str_count(string = texto, pattern = "[a-z]") # contamos minusculas
## [1] 149
# Detectamos un patron o palabra
str_detect(string = texto, pattern = "[á|é|í|ó|ú]") # Si hay palabras con acento
## [1] TRUE
# Remplazamos un texto
texto2 <- str_replace_all(string = texto, pattern = "-", replacement = "/")
texto2
## [1] "Vamos a trabajar con un texto creado para estos ejemplos, \nrecuerden que podemos hacer casi las mismas cosas para cada fila de una columna.\nAcá voy a poner unos números para usar de ejemplo; 123498/537"
# Removemos un patron
texto3 <- str_remove_all(string = texto2, pattern = "Acá.*")
texto3
## [1] "Vamos a trabajar con un texto creado para estos ejemplos, \nrecuerden que podemos hacer casi las mismas cosas para cada fila de una columna.\n"