Capítulo 4 Package Tidyverse

Tidyverse es un ecosistema de paquetes en R diseñados para ciencia de datos, el que nos ayuda en todo el proceso de la importación, transformación, visualización y modelamiento datos. Una de las principales ventajas es que estos paquetes comparten formas de uso y estructuras comunes.

## ── Attaching packages ─────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.3.2     ✓ purrr   0.3.3
## ✓ tibble  3.0.3     ✓ dplyr   1.0.1
## ✓ tidyr   1.1.1     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.5.0
## ── Conflicts ────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Algunas bibliotecas que contiene disponible tidyverse son las siguientes:

  • readr
  • dplyr
  • tidyr
  • tibble
  • stringr
  • forcats
  • ggplot2

4.1 library readr para importar datos

El objetivo de readr es proporcionar una forma rápida y sencilla de leer datos con formato csv, tsv y fwf. Está diseñado para analizar de manera flexible muchos tipos de datos.

4.1.1 Leer datos tabulares

readr admite siete formatos de archivo con las siguientes funciones:

CODIGO DESCRIPCIÓN
read_csv("file.cvs") archivos separados por comas (CSV)
read_cvs2("file.cvs") archivos delimitados por punto comas
read_tsv("file.cvs") archivos separados por tabulaciones
read_delim("file.cvs") archivos delimitados generales
read_fwf("file.cvs") archivos de ancho fijo
read_table("file.cvs") archivos tabulares donde las columnas están separadas por espacios en blanco
read_log("file.cvs") archivos de registro web

4.1.1.1 función para importar csv read_csv()

para llamar a read_csv tendrá el siguiente aspecto.

read_csv() abrirá un archivo CSV y lo leerá línea por línea. También leerá en las primeras filas de la tabla para averiguar el tipo de cada columna (si esta pertenece a un entero, carácter, etc.). En el caso de que haber alguna dificultad para identificar el tipo de cada columna, esto se puede resolver usando el argumento col_types mostrando a qué tipo pertenece la columna como c caracter y i entero y con el argumento n_max señalamos la cantidad de observaciones. como se muestra a continuación:

4.1.1.2 función read_csv2()

read.csv() y read.csv2() están pensados para leer archivos de valores separados por comas con .csv o read.csv2. Para más información vea el siguiente link: https://readr.tidyverse.org/

4.1.2 Leer datos no tabulares

CODIGO Descripción
read_file ( archivo, locale = default_locale ()) Leer un archivo en una sola cadena
read_lines ( file, skip = 0, n_max = -1L, na = character (), locale = default_locale (), progress = interactive ()) Leer cada línea en su propia cadena
read_log ( archivo, col_names = FALSE, col_types = NULL, skip = 0, n_max = -1, progress = interactive ()) Leer archivos de registro de estilo Apache
read_file_raw ( archivo) Leer un archivo en un vector sin formato
read_lines_raw ( archivo, saltar = 0, n_max = -1L, progreso = interactivo ()) Leer cada línea en un vector sin formato

4.1.3 Especificar el tipo de datos

En ocasiones es necesarios especificar el tipo de dato que posee cada columna para ellos se usa la función cols().

4.1.4 Encoding

Existen algunos problemas en la lectura de los archivos, como se muestra con el lenguaje en español ya que en algunos casos no reconoce los tildes y la ñ. Esto puede generar algunos problemas a la hora de utilizar algunos paquetes. Para ello usamos el argumento encoding =.

Si no establece una codificación predeterminada, los archivos se abrirán con UTF-8 (en el escritorio Mac, el escritorio Linux y el servidor) o la codificación predeterminada del sistema (en Windows). El caso del español es recomendable utilizar el “ASCII” o el “ISO-8849-1”. Pero es recomendable ir observando cómo se comporta los datos con diferentes enconding ya que no en todos los casos estos sirven para solucionar el problema.

4.2 Library dplyr para manipulación de datos

la librería dplyr es una gramática de manipulación de datos que proporciona verbos que ayudan a la manipulación de datos. Algunas funciones más importantes son las siguientes:

CODIGO DESCRIPCIÓN
filter() Filtra datos basados en sus valores.
mutate() Agrega nuevas variables que son funciones de variables existentes
select() Elige variables en función de sus nombres.
summarise() Reduce varios valores a un solo resumen.
arrange() Cambia el orden de las filas.
slice() Elige filas según la ubicación.
relocate() Cambia el orden de las columnas.

Todos ellos se combinan de forma natural con group_by().

Para más información vea el siguiente link. Cheatsheet : https://rstudio.com/wp-content/uploads/2015/03/data-wrangling-spanish.pdf

A continuación, a través de la base de datos de Airbnb New York.

##             id neighbourhood_group       room_type price
## 48886 36482809           Manhattan    Private room    75
## 48887 36483010           Manhattan Entire home/apt   200
## 48888 36483152            Brooklyn Entire home/apt   170
## 48889 36484087           Manhattan    Private room   125
## 48890 36484363              Queens    Private room    65
## 48891 36484665            Brooklyn    Private room    70
## 48892 36485057            Brooklyn    Private room    40
## 48893 36485431           Manhattan Entire home/apt   115
## 48894 36485609           Manhattan     Shared room    55
## 48895 36487245           Manhattan    Private room    90
## 'data.frame':    10 obs. of  4 variables:
##  $ id                 : int  36482809 36483010 36483152 36484087 36484363 36484665 36485057 36485431 36485609 36487245
##  $ neighbourhood_group: Factor w/ 5 levels "Bronx","Brooklyn",..: 3 3 2 3 4 2 2 3 3 3
##  $ room_type          : Factor w/ 3 levels "Entire home/apt",..: 2 1 1 2 2 2 2 1 3 2
##  $ price              : int  75 200 170 125 65 70 40 115 55 90

4.2.1 Funciones principales

4.2.1.1 Función mutate() para realizar operaciones de columnas.

Es útil agregar nuevas columnas que sean funciones de columnas existentes. Con la función mutate() sirve más que nada para realizar operaciones matemáticas. Como, por ejemplo si queremos crear una columna de comisión con un cálculo de 12%.

##          id neighbourhood_group       room_type price comision
## 1  36482809           Manhattan    Private room    75      9.0
## 2  36483010           Manhattan Entire home/apt   200     24.0
## 3  36483152            Brooklyn Entire home/apt   170     20.4
## 4  36484087           Manhattan    Private room   125     15.0
## 5  36484363              Queens    Private room    65      7.8
## 6  36484665            Brooklyn    Private room    70      8.4
## 7  36485057            Brooklyn    Private room    40      4.8
## 8  36485431           Manhattan Entire home/apt   115     13.8
## 9  36485609           Manhattan     Shared room    55      6.6
## 10 36487245           Manhattan    Private room    90     10.8
##             id neighbourhood_group       room_type price
## 48886 36482809           Manhattan    Private room    75
## 48887 36483010           Manhattan Entire home/apt   200
## 48888 36483152            Brooklyn Entire home/apt   170
## 48889 36484087           Manhattan    Private room   125
## 48890 36484363              Queens    Private room    65
## 48891 36484665            Brooklyn    Private room    70
## 48892 36485057            Brooklyn    Private room    40
## 48893 36485431           Manhattan Entire home/apt   115
## 48894 36485609           Manhattan     Shared room    55
## 48895 36487245           Manhattan    Private room    90

Algunas funciones que se pueden complementar con la anterior función son las siguientes:

CODIGO DESCRIPCIÓN
+, -,/,*,log() Operaciones matematicas
lag() o lead() Busca los valores “anterior” o “siguiente” en un vector.
na_if() , coalesce() Para reemplazar los valores perdidos con un valor especificado
if_else(), recode(), case_when() Condicionales.

4.2.1.2 Seleccionar columnas con la función select().

La función select() permite extraer un subconjunto del tibble.

##             id       room_type neighbourhood_group
## 48886 36482809    Private room           Manhattan
## 48887 36483010 Entire home/apt           Manhattan
## 48888 36483152 Entire home/apt            Brooklyn
## 48889 36484087    Private room           Manhattan
## 48890 36484363    Private room              Queens
## 48891 36484665    Private room            Brooklyn
## 48892 36485057    Private room            Brooklyn
## 48893 36485431 Entire home/apt           Manhattan
## 48894 36485609     Shared room           Manhattan
## 48895 36487245    Private room           Manhattan

Una forma contraria de usarla es agregando ! que nos dices que queremos sacar esas variables de la data.

## Warning in x:y: numerical expression has 3 elements: only the first used
##             room_type price
## 48886    Private room    75
## 48887 Entire home/apt   200
## 48888 Entire home/apt   170
## 48889    Private room   125
## 48890    Private room    65
## 48891    Private room    70
## 48892    Private room    40
## 48893 Entire home/apt   115
## 48894     Shared room    55
## 48895    Private room    90

Hay una serie de funciones auxiliares se pueden utilizar dentro select(), como los siguientes:

CODIGO DESCRIPCIÓN
- Selecciona todas las variables excepto
: Selecciona un rango
contains() Selecciona variables cuyo nombre contiene la cadena de texto
everything() Selecciona todas las columnas
one_of() Selecciona variables cuyos nombres están en un grupo de nombres
starts_with() Comienza con un prefijo
ends_with() Termina con un sufijo.
contains() Contiene una cadena literal..
matches() Coincide con una expresión regular.
num_range () Coincide con un rango numérico como x01, x02, x03.

4.2.1.3 Función filter() para filtar observaciones.

Esta función nos permite seleccionar un subconjunto de filas en un marco de datos. Usaremos %>% para concatenar la data frame, luego dentro de la función pondremos el nombre de las variables que deseamos buscar o filtrar luego ponemos == todas las observaciones que tenga Brooklyn y para realizar el segundo filtro se separa con una coma para luego repetir lo anteriormente mencionado.

Ahora queremos saber los alojamientos que se encuentra en la Brooklyn con habitación Entire home/apt.

##         id neighbourhood_group       room_type price
## 1 36483152            Brooklyn Entire home/apt   170

El uso en la operación %in%, el cual funciona para recuperar más de un elemento de la misma columna o variable.

##         id neighbourhood_group       room_type price
## 1 36483152            Brooklyn Entire home/apt   170
## 2 36484363              Queens    Private room    65
## 3 36484665            Brooklyn    Private room    70
## 4 36485057            Brooklyn    Private room    40

Condiciones multiples

Pero filter() permite otros tipos de condiciónales múltiples:

CODIGO DESCRIPCIÓN
filter(condición1, condición2) Devolverá como resultado las filas que cumplan ambas condiciones.(,= Y)
filter(condición1, !condición2) Obtendrá como resulta las filas para las cuales se cumple la condición uno mas no la condición dos.(!= NO)
filter(condición1 | condición2) Elige variables en función de sus nombres.(
filter(xor(condición1, condición2) Obtendrá como resultado las filas en las que cumplan solo una de las condiciones.(,= Y)

Ejemplo el precio mayor a 5 dólares y que este en el distrito de Brooklyn o que no pertenezca a Entire home/apt como tipo de habitación.

##         id neighbourhood_group       room_type price
## 1 36483152            Brooklyn Entire home/apt   170

Filtrando las filas cuyas observaciones no contienen información (NA).

##          id neighbourhood_group       room_type price
## 1  36482809           Manhattan    Private room    75
## 2  36483010           Manhattan Entire home/apt   200
## 3  36483152            Brooklyn Entire home/apt   170
## 4  36484087           Manhattan    Private room   125
## 5  36484363              Queens    Private room    65
## 6  36484665            Brooklyn    Private room    70
## 7  36485057            Brooklyn    Private room    40
## 8  36485431           Manhattan Entire home/apt   115
## 9  36485609           Manhattan     Shared room    55
## 10 36487245           Manhattan    Private room    90
CODIGO DESCRIPCIÓN
Filter_all() actúa sobre todas las columnas.
Filter_if() yfilter_at() actúa sobre un grupo específico de columnas.

Antes de mostrar el ejemplo es importante destacar los siguientes comandos any_vars() es equivalente al condicional “o”, así el comando all_vars() es equivalente al condicional “y”.

El siguiente código selecciona todas las filas que contengan valores mayores a 5.

##          id neighbourhood_group       room_type price
## 1  36482809           Manhattan    Private room    75
## 2  36483010           Manhattan Entire home/apt   200
## 3  36483152            Brooklyn Entire home/apt   170
## 4  36484087           Manhattan    Private room   125
## 5  36484363              Queens    Private room    65
## 6  36484665            Brooklyn    Private room    70
## 7  36485057            Brooklyn    Private room    40
## 8  36485431           Manhattan Entire home/apt   115
## 9  36485609           Manhattan     Shared room    55
## 10 36487245           Manhattan    Private room    90

4.2.1.4 Función arrange() para ordenar observaciones.

La funciona arrange() selecciona filas y las reordena, para ello se necesita un marco de datos y un conjunto de nombres de columna para ordenar.

##          id neighbourhood_group       room_type price
## 1  36483152            Brooklyn Entire home/apt   170
## 2  36484665            Brooklyn    Private room    70
## 3  36485057            Brooklyn    Private room    40
## 4  36483010           Manhattan Entire home/apt   200
## 5  36485431           Manhattan Entire home/apt   115
## 6  36482809           Manhattan    Private room    75
## 7  36484087           Manhattan    Private room   125
## 8  36487245           Manhattan    Private room    90
## 9  36485609           Manhattan     Shared room    55
## 10 36484363              Queens    Private room    65

Esta se suele usar con la función desc()para ordenar de forma descendente.

##          id neighbourhood_group       room_type price
## 1  36485609           Manhattan     Shared room    55
## 2  36482809           Manhattan    Private room    75
## 3  36484087           Manhattan    Private room   125
## 4  36484363              Queens    Private room    65
## 5  36484665            Brooklyn    Private room    70
## 6  36485057            Brooklyn    Private room    40
## 7  36487245           Manhattan    Private room    90
## 8  36483010           Manhattan Entire home/apt   200
## 9  36483152            Brooklyn Entire home/apt   170
## 10 36485431           Manhattan Entire home/apt   115

4.2.1.5 Función slice() para seleccionar, eliminar y duplicar filas

Esta función permite indexar filas por sus ubicaciones (enteras), esto permite seleccionar, eliminar y duplicar filas. Por ejemplo, si queremos saber los caracteres de los números de filas 6 al 13.

##         id neighbourhood_group       room_type price
## 1 36484665            Brooklyn    Private room    70
## 2 36485057            Brooklyn    Private room    40
## 3 36485431           Manhattan Entire home/apt   115
## 4 36485609           Manhattan     Shared room    55
## 5 36487245           Manhattan    Private room    90

Otras variaciones son slice_head() y slice_tail() seleccione la primera o la última fila.

##         id neighbourhood_group       room_type price
## 1 36484363              Queens    Private room    65
## 2 36484665            Brooklyn    Private room    70
## 3 36485057            Brooklyn    Private room    40
## 4 36485431           Manhattan Entire home/apt   115
## 5 36485609           Manhattan     Shared room    55
## 6 36487245           Manhattan    Private room    90

slice_sample()selecciona filas al azar.

##         id neighbourhood_group       room_type price
## 1 36484665            Brooklyn    Private room    70
## 2 36485057            Brooklyn    Private room    40
## 3 36485431           Manhattan Entire home/apt   115
## 4 36485609           Manhattan     Shared room    55
## 5 36487245           Manhattan    Private room    90

Con las funciones slice_min() y slice_max() selecciona las filas con los valores más altos o más bajos de una variable.

##         id neighbourhood_group       room_type price
## 1 36483010           Manhattan Entire home/apt   200
## 2 36483152            Brooklyn Entire home/apt   170
## 3 36484087           Manhattan    Private room   125

4.2.1.6 Función relocate() cambiar posición de las columnas.

Utilice una sintaxis similar select() a la de mover bloques de columnas a la vez.

##       price       room_type neighbourhood_group       id
## 48886    75    Private room           Manhattan 36482809
## 48887   200 Entire home/apt           Manhattan 36483010
## 48888   170 Entire home/apt            Brooklyn 36483152
## 48889   125    Private room           Manhattan 36484087
## 48890    65    Private room              Queens 36484363
## 48891    70    Private room            Brooklyn 36484665
## 48892    40    Private room            Brooklyn 36485057
## 48893   115 Entire home/apt           Manhattan 36485431
## 48894    55     Shared room           Manhattan 36485609
## 48895    90    Private room           Manhattan 36487245

4.2.1.7 Función summarise() para realizar operaciones estadisticas.

El último verbo es summarise(). Colapsa un marco de datos en una sola fila.

##   price_mean
## 1      100.5

4.2.1.8 argumentos complementarias de la función summarise()

CODIGO CODIGO DESCRIPCIÓN
mean() Medida aritmética Función genérica para la media aritmética
median() Medida aritmética Función genérica para la mediana aritmética
sd() Propagación Calcula la desviación estándar de los valores.
IQR() Propagación Calcula el intervalo intercuartil de los valores.
mad() Propagación Calcula la mediana de desviación absoluta.
min() Gama Calcula la minima.
max() Gama Calcula el maximo.
mad() Gama Produce cuantilos de muestra correspondientes a las probabilidades dadas..
n() Contar Cuenta la cantidad.
n_distinct() Contar Cuenta la cantidad de observaciones distintas.
all() Lógica Dado un conjunto de vectores lógicos, ¿todos los valores son verdaderos?.
any() Lógica Dado un conjunto de vectores lógicos, ¿es al menos uno de los valores verdaderos?
4.2.1.8.1 summarise() varias columnas
CODIGO DESCRIPCIÓN
summarise_all() Afecta a todas las variables
summarise_at() Afecta a las variables seleccionadas con un vector de caracteres o vars().
summarise_if() Afecta a las variables seleccionadas con una función de predicado.

4.2.2 Funciones sencundarias

4.2.2.1 Obtener las observaciones distintas con distinct().

La función distinct() devuelve valores únicos en una data, se suele usar en conjunto con select() :

##         room_type
## 1    Private room
## 2 Entire home/apt
## 3     Shared room

4.2.2.2 agrupar observaciones con group_by()

Esta función toma una tbl existente y la convierte en una tbl agrupada donde las operaciones se realizan “por grupo”.

## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   room_type       price_mean
##   <fct>                <dbl>
## 1 Entire home/apt      162. 
## 2 Private room          77.5
## 3 Shared room           55

Otra variación de la anterior función group_by_at() en el cual utilizamos en número de columna.

## # A tibble: 10 x 5
## # Groups:   room_type [3]
##          id neighbourhood_group room_type       price price_mean
##       <int> <fct>               <fct>           <int>      <dbl>
##  1 36482809 Manhattan           Private room       75       77.5
##  2 36483010 Manhattan           Entire home/apt   200      162. 
##  3 36483152 Brooklyn            Entire home/apt   170      162. 
##  4 36484087 Manhattan           Private room      125       77.5
##  5 36484363 Queens              Private room       65       77.5
##  6 36484665 Brooklyn            Private room       70       77.5
##  7 36485057 Brooklyn            Private room       40       77.5
##  8 36485431 Manhattan           Entire home/apt   115      162. 
##  9 36485609 Manhattan           Shared room        55       55  
## 10 36487245 Manhattan           Private room       90       77.5

4.2.2.3 Crear una condicional con ifelse()

la Función if() es usada cuando deseamos que una operación se ejecute únicamente cuando una condición se cumple y else() es usada para indicarle que hacer en caso de la condición de un if() no se cumpla. ejemplo queremos crear una variable llamada tipo_de_precio que determine si el rango de precio es costosos o barato, si el precio es menor a 100 es barato de lo contrario es costoso.

##          id neighbourhood_group       room_type price tipo_de_precio
## 1  36482809           Manhattan    Private room    75         barato
## 2  36483010           Manhattan Entire home/apt   200        costoso
## 3  36483152            Brooklyn Entire home/apt   170        costoso
## 4  36484087           Manhattan    Private room   125        costoso
## 5  36484363              Queens    Private room    65         barato
## 6  36484665            Brooklyn    Private room    70         barato
## 7  36485057            Brooklyn    Private room    40         barato
## 8  36485431           Manhattan Entire home/apt   115        costoso
## 9  36485609           Manhattan     Shared room    55         barato
## 10 36487245           Manhattan    Private room    90         barato

Pero si queremos agregar más de una condicional por ejemplo por ejemplo si es menor o igual a 40 dólares es muy barato y si es mayor o igual a 200 es lujoso.

##          id neighbourhood_group       room_type price tipo_de_precio
## 1  36482809           Manhattan    Private room    75         barato
## 2  36483010           Manhattan Entire home/apt   200         lujoso
## 3  36483152            Brooklyn Entire home/apt   170        costoso
## 4  36484087           Manhattan    Private room   125        costoso
## 5  36484363              Queens    Private room    65         barato
## 6  36484665            Brooklyn    Private room    70         barato
## 7  36485057            Brooklyn    Private room    40     muy barato
## 8  36485431           Manhattan Entire home/apt   115        costoso
## 9  36485609           Manhattan     Shared room    55         barato
## 10 36487245           Manhattan    Private room    90         barato
##          id neighbourhood_group       room_type price tipo_de_precio
## 1  36482809           Manhattan    Private room    75         barato
## 2  36483010           Manhattan Entire home/apt   200        costoso
## 3  36483152            Brooklyn Entire home/apt   170        costoso
## 4  36484087           Manhattan    Private room   125        costoso
## 5  36484363              Queens    Private room    65         barato
## 6  36484665            Brooklyn    Private room    70         barato
## 7  36485057            Brooklyn    Private room    40         barato
## 8  36485431           Manhattan Entire home/apt   115        costoso
## 9  36485609           Manhattan     Shared room    55         barato
## 10 36487245           Manhattan    Private room    90         barato

4.3 Library tidyr para crear datos ordenados

La biblioteca tidyr sirve para crear datos ordenados:

  • Cada columna es variable.
  • Cada fila es una observación.
  • Cada celda es un valor único.

Tidy data describe una forma estándar de almacenar datos que se utiliza siempre que sea posible en tidyverse . Si se asegura de que sus datos estén ordenados.

Ahora veremos algunas funciones principales que podemos encontrar en la librería.

4.3.1 Unir las columnas en pares clave-valor con la función gather()

Esta función toma múltiples columnas y las une en pares clave-valor. Por ejemplo, tenemos la cantidad de vuelos internacionales de cada ciudad del año 2000 al 2003.

##              Pais vuelo_2000 vuelo_2001 vuelo_2002
## 1  Chile_Santiago     109002     108502     123230
## 2       Peru_Lima     145240     148540     196232
## 3 Colombia_Bogota     152421     125161     125843

Queremos unir las columnas vuelos 2000, 2001 y 2002, para ello usaremos la función gather() que tome el data frame vuelos_internacionales, y una las columnas 2:4, metiendo el resultado en el par clave (vuelos) – valor (total vuelos).

##              Pais      Vuelo total_vuelos
## 1  Chile_Santiago vuelo_2000       109002
## 2       Peru_Lima vuelo_2000       145240
## 3 Colombia_Bogota vuelo_2000       152421
## 4  Chile_Santiago vuelo_2001       108502
## 5       Peru_Lima vuelo_2001       148540
## 6 Colombia_Bogota vuelo_2001       125161
## 7  Chile_Santiago vuelo_2002       123230
## 8       Peru_Lima vuelo_2002       196232
## 9 Colombia_Bogota vuelo_2002       125843

4.3.2 Distribuya un par clave-valor en varias columnas con la función spread()

Esta función es usada cuando tenemos una observación dispersa en múltiples filas. Por ejemplo si tenemos el data frame anterior y queremos pasarlo a su estado original separando cada vuelo en columna se usa la función spread().

##              Pais vuelo_2000 vuelo_2001 vuelo_2002
## 1  Chile_Santiago     109002     108502     123230
## 2 Colombia_Bogota     152421     125161     125843
## 3       Peru_Lima     145240     148540     196232

4.3.3 Separar una columna en varias columnas con la función separate()

La Función separate() sirve para separar observaciones, por ejemplo queremos separar las observaciones que se Encuentran en la variable país en dos, una que contenga los países y otra que contenga la ciudades.

##       pais   ciudad      Vuelo total_vuelos
## 1    Chile Santiago vuelo_2000       109002
## 2     Peru     Lima vuelo_2000       145240
## 3 Colombia   Bogota vuelo_2000       152421
## 4    Chile Santiago vuelo_2001       108502
## 5     Peru     Lima vuelo_2001       148540
## 6 Colombia   Bogota vuelo_2001       125161
## 7    Chile Santiago vuelo_2002       123230
## 8     Peru     Lima vuelo_2002       196232
## 9 Colombia   Bogota vuelo_2002       125843

Por defecto, la función separete usa como separador cualquier valor no alfa-numerico.

4.3.4 Une varias columnas en una con la función unite()

Esta función es la contraria de la anterior función.

Si agregamos la función Mutate() antes de la función unique() se creara una nueva columna manteniendo las variables originales que se unieron.

4.4 Library stringr para la manipulación de las observaciones.

Con la librería stringr Hay cuatro principales funciones, el primero es la manipulación de caracteres; estas funciones le permiten manipular caracteres individuales dentro de las cadenas en vectores de caracteres. La segunda son las herramientas de espacios en blanco para agregar, eliminar y manipular espacios en blanco, el tercero son las operaciones sensibles a la configuración regional cuyas operaciones variarán de una ubicación a otra y por último son las funciones de coincidencia de patrones.

Algunas funciones estacadas son las siguientes.

4.4.1 Manipulación de la observación.

Podemos obtener la longitud de la cadena con la función str_length():

## [1] 4

Se puede acceder a una letra específica con la función str_sub() colocando la variable y luego la posición que deseamos buscar en este caso la 2.

## [1] "o" "e"

Estos nos sirven también para modificar la cadena por ejemplo queremos remplazar la o y la e por una X .

## [1] "hXla"  "hXllo"

También podemos duplicar las cadenas con la función str_dup().

## [1] "hXlahXla"   "hXllohXllo"

4.4.2 Especio en blanco

Con la función str_pad() rellena una cuerda a una longitud fija agregando espacios en blanco adicionales a la izquierda, derecha o ambos lados.

## [1] "      hXla" "     hXllo"
## [1] "   hXla   " "  hXllo   "

Entonces, si desea asegurarse de que todas las cadenas tengan la misma longitud, combine str_pad() y str_trunc():

## [1] "hXla      " "hXllo     "

Lo contrario de lo anterior es la función str_trim() que elimina los espacios en blanco.

## [1] "hola"  "hello"

Agregaremos left para indicar que dirección eliminar.

## [1] "hola  "  "hello  "

Puede utilizar la función str_wrap() para modificar los espacios en blanco existentes para ajustar un párrafo de texto, de modo que la longitud de cada línea sea lo más similar posible.

4.4.3 Sensible a la configuración regional

Si queremos modificar las palabras de pasarla de minúscula a mayúscula se utiliza la función str_to_upper().

## [1] "HOLA"  "HELLO"

De mayúscula a minúscula.

## [1] "Hola"  "Hello"

Sí queremos ordenar y clasificar la cadena usaremos la función str_order() y str_sort().

## [1] 2 1 3
## [1] "b" "c" "e"

4.4.4 La coincidencia de patrones

La gran mayoría de funciones de stringr funcionan con patrones, estos están parametrizados por la tarea que realizan y los tipos de patrones que coinciden.

Usaremos la función str_detect() detecta la presencia o ausencia de un patrón y devuelve un vector lógico. Por ejemplo, para saber cuál pertenece a un número telefónico.

## [1] FALSE  TRUE  TRUE  TRUE

Con la función str_subset() devuelve los elementos de un vector de caracteres que coinciden con una expresión regular.

## [1] "219 733 8965"                             
## [2] "329-293-8753"                             
## [3] "casa: 579-499-7527; trabajo: 543.355.3679"

Ahora con la función str_count() cuenta el número de coincidencias, por ejemplo, queremos saber cuántos números de teléfonos existe en la cadena.

## [1] 0 1 1 2

Con la función str_locate() localiza la primera posición de un patrón y devuelve una matriz numérica con columnas al comienzo y al final, por ejemplo, si queremos saber en qué parte de la cadena se encuentra el número de teléfono.

##      start end
## [1,]    NA  NA
## [2,]     1  12
## [3,]     1  12
## [4,]     7  18

La función str_locate_all() localiza todas las coincidencias, devolviendo una lista de matrices numéricas.

## [[1]]
##      start end
## 
## [[2]]
##      start end
## [1,]     1  12
## 
## [[3]]
##      start end
## [1,]     1  12
## 
## [[4]]
##      start end
## [1,]     7  18
## [2,]    30  41

Si queremos extraer el texto correspondiente a la primera coincidencia, devolviendo un vector de caracteres con la función str_extract().

## [1] NA             "219 733 8965" "329-293-8753" "579-499-7527"

Si queremos ver todos los números telefónicos usaremos la función str_extract_all().

## [[1]]
## character(0)
## 
## [[2]]
## [1] "219 733 8965"
## 
## [[3]]
## [1] "329-293-8753"
## 
## [[4]]
## [1] "579-499-7527" "543.355.3679"

Ahora si queremos remplazar los números usaremos la función str_replace() reemplaza el primer patrón coincidente y devuelve un vector de caracteres.

## [1] "celular"                                  
## [2] "XXX-XXX-XXXX"                             
## [3] "XXX-XXX-XXXX"                             
## [4] "casa: XXX-XXX-XXXX; trabajo: 543.355.3679"
## [1] "celular"                                  
## [2] "XXX-XXX-XXXX"                             
## [3] "XXX-XXX-XXXX"                             
## [4] "casa: XXX-XXX-XXXX; trabajo: XXX-XXX-XXXX"

4.5 Library ggplot2 para graficar.

Con esta Librería podemos construir diferentes gráficos que nos ayuda a entender mejor los datos, todos los gráficos que pertenecen en ggplot2 comienzan con una llamada a ggplot(), proporcionando datos predeterminados y asignaciones estéticas, especificadas por aes(). En el siguiente diagrama se muestra la sintaxis básica para armar un código para graficar:

sintaxis basica para grafica en R.

Figura 4.1: sintaxis basica para grafica en R.

Como se observó en el diagrama anterior, toda las nuevas funciones se agregan usando + y la función que determina el tipo de grafico se agrega luego de la función ggplot(). A continuación, veremos en la siguiente imagen las partes básicas de un gráfico.

Partes basicas de un gráfico en R.

Figura 4.2: Partes basicas de un gráfico en R.

Para explicar los diferentes gráficos que posee esta librería usaremos la base de datos de airbnb, mostrando los argumentos de las funciones que determina el tipo del gráfico y las diferentes funciones complementarias.

##             id neighbourhood_group       room_type price availability_365
## 48886 36482809           Manhattan    Private room    75              353
## 48887 36483010           Manhattan Entire home/apt   200              176
## 48888 36483152            Brooklyn Entire home/apt   170              365
## 48889 36484087           Manhattan    Private room   125               31
## 48890 36484363              Queens    Private room    65              163
## 48891 36484665            Brooklyn    Private room    70                9

4.5.1 Gráficos de Barras Barplot()

Uno de los tipos de gráficos más comunes en el análisis de datos es el gráfico de barras. Para formar el código del grafico primero debemos llamar la función ggplot() en data debemos colocar el nombre del dataset. En cuanto en la función aes() se coloca la variable que va en el eje X, luego agregando + se estable el tipo de grafico que queremos tener en este caso es un gráfico de barra geom_bar().

Argumentos que podemos agregar a la función geom_bar():

Argumentos Descripción
width = Grosor de la barra.
color = Color del borde del de los gráficos.
fill = Color de interior del grafico

Como podemos ver en el siguiente gráfico:

Algunas funciones complementarias que podemos utilizar:

funciones Descripción
aes() Con esta función configura la variable categórica para el eje X, usa el numérico para el eje Y.
geom_bar() Título del gráfico.
ggtitle() Título del grafico
xlab() Nombre de los ejes X .
ylab() Nombre de los ejes Y .
coord_flip() Cambiar la orientación de los ejes
labs(fill = ) Para cambiar el título de la leyenda
geom_text() Etiquetas en las barras

Puedes ver los colores disponibles el siguiente link: http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf

También podemos agregar etiquetas a los gráficos para ellos usamos la función geom_text(), y algunos de los argumentos de la función geom_text():

Argumentos Descripción
vjust = La ubicación de la etiqueta marcando el término de la barra como referencia 0
size = Tamaño de la letra.
color = Color de la letra

4.5.1.1 Leyenda de la barra y color

Para agregar color a las barras usamos las siguientes funciones:

Función Descripción
scale_color_manual () Para usar colores personalizados
scale_color_brewer () Para usar paletas de colores del paquete RColorBrewer
scale_color_grey () Para usar paletas de colores grises

Además si agregamos el argumento fill = as.factor(room_type) en la función ggplot() agregamos una leyenda para habitaciones y para cambiar el nombre se usa la función labs(fill = "" ).

para cambiar la posición de la leyenda usamos la función theme(legend.position="") agregando un top para poner la leyenda en la parte superior y bottom en la parte inferior.

4.5.1.2 Con múltiples grupos

si queremos realizar gráficos con múltiples variable debemos agregar a la función aes() el argumento fill = en este caso usamos los distritos y además agregamos en la y = los precios de las habitaciones.

Ahora otra forma de realizar el mismo grafico anterior solo cambiando la posición de la barra es agregando en la función geom_bar() el argumento position=position_dodge() es de la siguiente manera:

La función geom_errorbar() se puede utilizar para producir un gráfico de barras con barras de error.

4.5.2 Diagrama de caja con la función geom_boxplot ()

Boxplots o gráficos de caja, son útiles para visualizar la distribución de los datos de acuerdo con una variable o condición de interés.

Argumentos de la función geom_boxplot ():

Argumentos Descripción
outlier.colour= Color del punto periférico.
outlier.shape = Forma del punto periférico.
outlier.size = Tamaño del punto periférico.
notch=TRUE Forma de la caja
fill= Color de la caja
color= Color del borde de la caja

Algunas funciones complementarias que podemos utilizar:

funciones Descripción
aes() Con esta función configura la variable categórica para el eje X, usa el numérico para el eje Y.
geom_bar() Título del gráfico.
ggtitle() Titulo del grafico
xlab() Nombre de los ejes X .
ylab() Nombre de los ejes Y .
coord_flip() Cambiar la orientación de los ejes
labs(fill = ) Para cambiar el título de la leyenda
geom_text() Etiquetas en las barras

La función stat_summary () se puede usar para agregar puntos medios a un diagrama de caja:

Si queremos agregar puntos usamos las funciones geom_dotplot () o geom_jitter () :

4.5.3 Gráficos de dispersión con la función geom_point ()

El diagrama de dispersión permite estudiar las relaciones entre dos conjuntos asociados de datos que aparecen en pares. Algunos argumentos de la función geom_point ():

Argumentos Descripción
size = Tamaño de fuente base, expresado en pts.
shape = La forma del punto.
colour = color del borde del punto
fill = color del fondo del punto

Para realizar el ejemplo anterior vamos a crear una nueva variable llamada ingreso:

Para cambiar la forma del punto puedes elegir uno de los que se muestra en la siguiente imagen:

Forma del punto.

Figura 4.3: Forma del punto.

4.5.4 Temas de los gráficos

Como observamos en la Figure 4.2: Partes basicas de un gráfico en R. Para cambiar el tema de un grafico se usa función theme_(). a A continuación, veremos el ejemplo que utilizaremos para ilustrar los diferentes temas disponibles.

Argumentos Descripción
base_size Tamaño de fuente base, expresado en pts.
base_family Familia de fuentes base.
base_line_size Tamaño base para elementos de línea
base_rect_size Tamaño base para elementos rect

En cuanto a las funciones que cambian el color del tema son los siguiente:

funciones Descripción
theme_gray() Fondo gris y líneas de cuadrícula blancas.
theme_bw() Fondo blanco y líneas de cuadrícula gris.
theme_linedraw() Fondo blanco y líneas de cuadrícula negra.
theme_light() fondo blanco y líneas de cuadrícula gris (mas intensa las líneas)
theme_dark() Lo mismo que lo anterior pero con fondo negro.
theme_minimal() Tema minimalista sin anotaciones de fondo .
theme_classic() Un tema de aspecto clásico, con líneas de eje x e y,y sin líneas de cuadrícula
theme_void() Un tema completamente vacío.
theme_classic() Enmarca el grafico

4.6 Otros packages relacionados.

4.6.1 Packages data.table

data.table es un paquete extremadamente rápido y eficiente en memoria para transformar datos en R. Funciona convirtiendo los objetos de marco de datos nativos de R en data.tables con una funcionalidad nueva y mejorada.

dt[i,j, by]

dt Toma data.table. i Subconjunto de filas usando. j Manipular columnas. by Agrupados según.

Ejemplo tenemos el data frame BaseA.

Subconjunto de filas usando i

Subconjunto de filas basadas en números de fila.

##   ID  A  B
## 1  1 x1 y1
## 2  2 x2 y2
## 3  3 x3 y3

Filas de subconjunto basadas en valores en una o más columnas.

##   ID  A  B
## 4  4 x4 y4
## 5  5 x5 y5
## 6  6 x6 y6

Manipular columnas con j Extraer columnas por número. Prefije los números de columna con “-” para eliminarlos.

## [1] x1 x2 x3 x4 x5 x6
## Levels: x1 x2 x3 x4 x5 x6

extraer columnas por nombre.

## [1] x1 x2 x3 x4 x5 x6
## Levels: x1 x2 x3 x4 x5 x6

4.6.1.1 Funciones para data.tables

##   ID  A
## 1  1 x1
## 2  2 x2
## 3  3 x3
## 4  4 x4
## 5  2 x2
## 6  3 x3

Extrae filas únicas según las columnas especificadas en “by”. Deje “por” para usar todas las columnas.

##   ID  A
## 1  1 x1
## 2  2 x2
## 3  3 x3
## 4  4 x4

4.6.1.2 Leer y escribir archivos

En el caso de importar datos se usa la función fread()

TIPO CODIGO DESCRIPCIÓN
Importar fread (" file.csv ") Lee datos de un archivo plano como .csv o .tsv en R
exportación fwrite(dt, "file.csv") Escribe datos en un archivo plano desde R

Para más información vea el siguiente enlace.

Cheatsheet: https://github.com/Rdatatable/data.table