Introducción

El proceso de análisis de datos siempre conlleva procedimientos de limpieza de los valores que implican realizar eliminación o generación de nuevos datos. Este proceso es relevante ya que sin datos eficientes y veraces todos los procesos posteriores serán erróneos o poco eficaces.

Además, R trabaja en forma preferente con datos tabulados (en forma de tablas) y su formato preferido es el dataframe. Los datos tabulados establecen:

  • Cada variable esta almacenada en su propia columna.
  • Cada observación esta almacenada en su propia fila.
  • Cada tabla corresponde a un tipo de observación.

El análisis de los datos tiene como objetivo extraer información de ello. Por ello se requiere entre otras operaciones: Extraer las variables existentes en el conjunto de datos, Extraer las observaciones preexistentes, Derivar nuevas variables sobre las ya existentes y Cambiar las unidades de las variables.

El paquete Tidyverse provee una serie de herramientas destinadas a facilitar estos procesos.

Tidyverse es una colección de paquetes disponibles en R y orientados a la manipulación, importación, exploración y visualización de datos y que se utiliza exhaustivamente en ciencia de datos. El uso de Tidyverse permite facilitar el trabajo estadístico y la generación de trabajos reproducibles. Está compuesto de los siguientes paquetes:

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

https://www.tidyverse.org/

La forma más fácil es instalar tidyverse como paquete completo o también instalar las librerias específicas según necesidad.

Las librerias mínimas requeridas instaladas en su RStudio para este modulo:

#install.packages("tidyverse")
#install.packages('gapminder')
library(tidyverse)
#library(dplyr, quietly = TRUE)
library(gapminder)
# NOTA: 
# Se aplicará %>% head() en muchos casos de ejemplos para limitar la salida 
# de resultados a los primeros registros de las tablas resultantes
# "%>%" corresponde al uso de pipe, que permite el encadenamiento de resultados.
# head() limita los resultados a los 6 primeros registros.

Dataset

Para el desarrollo de los ejemplos de este módulo se utilizará Gapminder que es un set de datos poblacional con información demográfica de todos los países desde 1952. Incluye información de cantidad de población, expectativa de vida e ingresos per cápita.

Fuente: https://www.gapminder.org/data/documentation/

head(gapminder)
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.
# muestra el promedio de expectativa de vida y el total de población agrupados por país y continente
gapminder %>% group_by(country, continent) %>% 
  summarize(promedio = mean(lifeExp),
  total_pob = sum(as.numeric(pop))) %>% head()
## # A tibble: 6 x 4
## # Groups:   country [6]
##   country     continent promedio total_pob
##   <fct>       <fct>        <dbl>     <dbl>
## 1 Afghanistan Asia          37.5 189884585
## 2 Albania     Europe        68.4  30962990
## 3 Algeria     Africa        59.0 238504874
## 4 Angola      Africa        37.9  87712681
## 5 Argentina   Americas      69.1 343226879
## 6 Australia   Oceania       74.7 175791750
# La estructura de este dataset esta determinada por:
str(gapminder)
## tibble [1,704 × 6] (S3: tbl_df/tbl/data.frame)
##  $ country  : Factor w/ 142 levels "Afghanistan",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ continent: Factor w/ 5 levels "Africa","Americas",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ year     : int [1:1704] 1952 1957 1962 1967 1972 1977 1982 1987 1992 1997 ...
##  $ lifeExp  : num [1:1704] 28.8 30.3 32 34 36.1 ...
##  $ pop      : int [1:1704] 8425333 9240934 10267083 11537966 13079460 14880372 12881816 13867957 16317921 22227415 ...
##  $ gdpPercap: num [1:1704] 779 821 853 836 740 ...

Pipeline

Desde el paquete Dplyr, “%>%” es una herramienta para la ejecución de pipeline o tuberías de comandos que permite una encadenamiento de funciones de la forma:

gapminder %>%
  filter(year > 1985) %>%
  head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1987    40.8 13867957      852.
## 2 Afghanistan Asia       1992    41.7 16317921      649.
## 3 Afghanistan Asia       1997    41.8 22227415      635.
## 4 Afghanistan Asia       2002    42.1 25268405      727.
## 5 Afghanistan Asia       2007    43.8 31889923      975.
## 6 Albania     Europe     1987    72    3075321     3739.

Donde la ejecución de una sentencia o función es el argumento automático para la siguiente línea. Es una forma más simple y elegante de presentar la ejecución de código.

forma normal:

Seleccionar columnas mpg, cyl y hp del dataset mtcars para los vehículos con hp > 150.

data <- arrange(mtcars, cyl, hp)
data <- select(data, mpg, cyl, hp)
data <- filter(data, hp > 150)
arrange(data, desc(hp))

forma pipeline

mtcars %>%
  select(mpg, cyl, hp) %>%
  filter(hp > 150) %>%
  arrange(desc(hp))
##                      mpg cyl  hp
## Maserati Bora       15.0   8 335
## Ford Pantera L      15.8   8 264
## Duster 360          14.3   8 245
## Camaro Z28          13.3   8 245
## Chrysler Imperial   14.7   8 230
## Lincoln Continental 10.4   8 215
## Cadillac Fleetwood  10.4   8 205
## Merc 450SE          16.4   8 180
## Merc 450SL          17.3   8 180
## Merc 450SLC         15.2   8 180
## Hornet Sportabout   18.7   8 175
## Pontiac Firebird    19.2   8 175
## Ferrari Dino        19.7   6 175

Readr

Readr es el paquete orientado a facilitar de manera importante la importación de datos de “tipo rectangular” desde diversas fuentes hacia un objeto estructurado. Posee funciones para importar una serie de archivos que incluyen csv, tsv, delimitados, de ancho fijo e incluso archivos de tipo log.

La estructura obtenida es un Tibble, que es la implementación más avanzada de un data frame dentro de tidyverse. Posee ciertas diferencias con el data frame original entre las que se cuentan:

  • No convierte los tipos de variables.
  • No cambia los nombres de variables.
  • Presenta en pantalla solo las columnas que calzan en el ancho de ella.
  • Muestra el tipo de variable.

Esta librería trata de estimar el tipo el tipo de dato de cada columna e intenta realizar una conversión de tipos cuando sea apropiado.

https://cran.r-project.org/web/packages/readr/readr.pdf

Importación de datos

Readr esta destinado a capturar data en formato tabular y comparte con las distintas variaciones de esta los siguientes argumentos:

read_*(file, col_names=TRUE, col_types=NULL, locale=default_locale(), na=c("“,”NA“), quoted_na=TRUE, comment=”", trim_ws=TRUE, skip=0, n_max=INf, guess_max=min(1000,n_max), progress=interactive())

Donde tenemos como argumentos:

  • file: nombre y ubicación del archivo a importar. Si los archivos están comprimidos en algunos de los siguientes formatos: .gz, .bz2, xz o .zip serán automáticamente descomprimidos. Los que se encuentra en la wen () son descargados. NOTA: tambien puede utilizarse elementos del clipboard al usar el valor de clipboard().

  • col_names: TRUE si el archivo contiene encabezados de columna en la primera fila, en caso contrario se define como FALSE y será nominados como X1, x2, etc.. También se puede definir los nombres en forma personalizada si se agrega el vector respectivo: col_names=c(“A”,“B”,“C”, etc).

  • col_types: tipos de columna, si se establece a NULL tratará de imputar los tipos en base a las primeras 1000 filas de datos. Si se generan errores debe especificarse mediante cols() utilizando una entrada para cada columna del set de datos.

  • locale: Por definición es “US” pero puede alterarse para controlar el tipo de zona de tiempo, codificación, posiciones decimales y nombres de fecha.

  • na: Es un vector con aquellos caracteres que se considerarán valores perdidos (missing values): na=c(“1”, “.”,"“,”NA“) tomará los valores”1“,”.“,”" y “NA” como valores missing.

  • quoted_na: Los valores definidos como perdidos que estén entre comillas deben tratarse como valores NA. El valor predefinido.

  • comment: Comentarios opcionales.

  • trim_ws: Establece si recorta (trim) los espacios antes y después de cada campo.

  • skip: Indica si se salta alguna línea del archivo antes de iniciar la lectura: skip=1

  • skip_empty_rows: Si es TRUE ignora las filas vacías, de lo contrario mostrará “NA” en los valores de la fila vacía.

  • n_max: Selecciona un subconjunto de lineas a leer: n_max= 2, leera las dos primeras líneas del archivo file.

  • guess_max: Número máximo de registros para “evaluar” los tipos de columnas, por default es 1000.

  • progress: Permite mostrar una barra de progreso, adecuado para grandes volumenes de datos. FALSE lo desactiva. se actualiza cada 50.000 valores o cada 5 segundos.

read_csv()

Lectura de un archivo separado por comas “,”.

# lectura de un archivo csv
# como la especificación de las columnas pueden utilizarse estos en una nueva llamada copiando estas especificaciones de columna.
read_csv("Demographics.csv", skip_empty_rows = TRUE) %>% head()
## # A tibble: 6 x 13
##   CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##         <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
## 1       11000 M             M                    NA               2           0
## 2       11001 S             M                 60000               3           3
## 3       11002 M             M                 60000               3           3
## 4       11003 S             F                    NA               0           0
## 5       11004 S             F                 80000               5           5
## 6       11005 S             M                 70000               0           0
## # … with 7 more variables: NumberOfContracts <dbl>, Age <dbl>, Target <dbl>,
## #   Available401K <dbl>, CustomerValueSegment <dbl>, ChurnScore <dbl>,
## #   CallActivity <dbl>

Version completa

# utilizando las definiciones de columna obtenidas en codigo anterior.
demographic <- read_csv("Demographics.csv", col_types = cols(
  CustomerKey = col_double(),
  MaritalStatus = col_character(),
  Gender = col_character(),
  EstimatedYearlyIncome = col_double(),
  SentimentRating = col_double(),
  WebActivity = col_double(),
  NumberOfContracts = col_double(),
  Age = col_double(),
  Target = col_double(),
  Available401K = col_double(),
  CustomerValueSegment = col_double(),
  ChurnScore = col_double(),
  CallActivity = col_double()
)) %>% head()
demographic
## # A tibble: 6 x 13
##   CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##         <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
## 1       11000 M             M                    NA               2           0
## 2       11001 S             M                 60000               3           3
## 3       11002 M             M                 60000               3           3
## 4       11003 S             F                    NA               0           0
## 5       11004 S             F                 80000               5           5
## 6       11005 S             M                 70000               0           0
## # … with 7 more variables: NumberOfContracts <dbl>, Age <dbl>, Target <dbl>,
## #   Available401K <dbl>, CustomerValueSegment <dbl>, ChurnScore <dbl>,
## #   CallActivity <dbl>

read_csv2()

Es igual a read_csv pero el archivo debe estar separado por semicolon “;”.

# el archivo csv debe tener separador por semicolon ";"
demographic <- read_csv2("Demographics.csv")

read_delim()

A diferencia de las versiones anteriores esta permite especificar el carácter que delimita las columnas.

read_delim("Demographics.csv",",") 
## # A tibble: 18,484 x 13
##    CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##          <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
##  1       11000 M             M                    NA               2           0
##  2       11001 S             M                 60000               3           3
##  3       11002 M             M                 60000               3           3
##  4       11003 S             F                    NA               0           0
##  5       11004 S             F                 80000               5           5
##  6       11005 S             M                 70000               0           0
##  7       11006 S             F                 70000               0           0
##  8       11007 M             M                 60000               3           3
##  9       11008 S             F                 60000               4           4
## 10       11009 S             M                 70000               0           0
## # … with 18,474 more rows, and 7 more variables: NumberOfContracts <dbl>,
## #   Age <dbl>, Target <dbl>, Available401K <dbl>, CustomerValueSegment <dbl>,
## #   ChurnScore <dbl>, CallActivity <dbl>

read_fwf()

Esta función permite la lectura de archivos en los que las columnas tienen anchos fijos predeterminados.

Se puede agregar el argumento col_positions y las funciones fwf_empty

# read_fwf(
#   file,
#   col_positions,
#   col_types = NULL,
#   locale = default_locale(),
#   na = c("", "NA"),
#   comment = "",
#   trim_ws = TRUE,
#   skip = 0,
#   n_max = Inf,
#   guess_max = min(n_max, 1000),
#   progress = show_progress(),
#   skip_empty_rows = TRUE
# )

read_tsv()

Para la lectura de archivos separados por TAB.

read_log()

Permite la lectura de archivos de tipo log, utilizados en el despliegue de información de servicios tipo apache y similares. Si bien estos no presentan un estructura tabular a primera vista.

# lectura de un archivo de tipo log de apache
#read_log(f,col_names=FALSE, col_types=NULL, skip=0, n_max=-1, progress=interactive())
read_log("access_log") %>% head()
## # A tibble: 6 x 7
##   X1    X2    X3    X4                 X5                               X6    X7
##   <chr> <lgl> <lgl> <chr>              <chr>                         <dbl> <dbl>
## 1 ::1   NA    NA    03/Dec/2020:12:39… GET /PHPCourse2020 HTTP/1.1     301   244
## 2 ::1   NA    NA    03/Dec/2020:12:39… GET /PHPCourse2020/ HTTP/1.1    200   444
## 3 ::1   NA    NA    03/Dec/2020:12:39… GET /favicon.ico HTTP/1.1       200  1150
## 4 ::1   NA    NA    03/Dec/2020:12:41… GET /PHPCourse2020/01_commen…   200    NA
## 5 ::1   NA    NA    03/Dec/2020:12:41… GET /PHPCourse2020/02_variab…   200   159
## 6 ::1   NA    NA    03/Dec/2020:12:42… GET /PHPCourse2020/02_variab…   200   159
# lectura de un archivo log, versión completa
# define tipos de columna
read_log("/Applications/mappstack-7.3.10-0/apache2/logs/access_log", col_names = FALSE,
         col_types = cols(X1="c",X2="c",X3="c",X4="c",X5="c",X6="d",X7="d"),
         skip = 0,
         n_max = Inf,
         progress = show_progress()
         ) %>% head()
## # A tibble: 6 x 7
##   X1    X2    X3    X4                 X5                               X6    X7
##   <chr> <chr> <chr> <chr>              <chr>                         <dbl> <dbl>
## 1 ::1   <NA>  <NA>  03/Dec/2020:12:39… GET /PHPCourse2020 HTTP/1.1     301   244
## 2 ::1   <NA>  <NA>  03/Dec/2020:12:39… GET /PHPCourse2020/ HTTP/1.1    200   444
## 3 ::1   <NA>  <NA>  03/Dec/2020:12:39… GET /favicon.ico HTTP/1.1       200  1150
## 4 ::1   <NA>  <NA>  03/Dec/2020:12:41… GET /PHPCourse2020/01_commen…   200    NA
## 5 ::1   <NA>  <NA>  03/Dec/2020:12:41… GET /PHPCourse2020/02_variab…   200   159
## 6 ::1   <NA>  <NA>  03/Dec/2020:12:42… GET /PHPCourse2020/02_variab…   200   159

Establecer un subconjunto de los datos especificando solo las columna de interés.

# seleccionar algunas columnas y con "rename" cambiamos el nombre de ellas.
read_log("access_log", col_names = FALSE,
         col_types = cols(X1="c",X2="c",X3="c",X4="c",X5="c",X6="d",X7="d"),
         skip = 0,
         n_max = Inf,
         progress = show_progress()
         ) %>% 
  select(X4, X5, X6) %>% 
  rename(fecha=X4, url=X5, response=X6) %>%
  head()
## # A tibble: 6 x 3
##   fecha                      url                                        response
##   <chr>                      <chr>                                         <dbl>
## 1 03/Dec/2020:12:39:18 -0300 GET /PHPCourse2020 HTTP/1.1                     301
## 2 03/Dec/2020:12:39:18 -0300 GET /PHPCourse2020/ HTTP/1.1                    200
## 3 03/Dec/2020:12:39:18 -0300 GET /favicon.ico HTTP/1.1                       200
## 4 03/Dec/2020:12:41:20 -0300 GET /PHPCourse2020/01_comments.php HTTP/1…      200
## 5 03/Dec/2020:12:41:25 -0300 GET /PHPCourse2020/02_variables.php HTTP/…      200
## 6 03/Dec/2020:12:42:14 -0300 GET /PHPCourse2020/02_variables.php HTTP/…      200

Valores perdidos (missing values)

Este proceso es relevante en el análisis de datos

Drop_na

Esta función simplemente elimina las filas que contienen valores “NA

# contiene valores NA en als primeras filas
read_csv("Demographics.csv") 
## # A tibble: 18,484 x 13
##    CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##          <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
##  1       11000 M             M                    NA               2           0
##  2       11001 S             M                 60000               3           3
##  3       11002 M             M                 60000               3           3
##  4       11003 S             F                    NA               0           0
##  5       11004 S             F                 80000               5           5
##  6       11005 S             M                 70000               0           0
##  7       11006 S             F                 70000               0           0
##  8       11007 M             M                 60000               3           3
##  9       11008 S             F                 60000               4           4
## 10       11009 S             M                 70000               0           0
## # … with 18,474 more rows, and 7 more variables: NumberOfContracts <dbl>,
## #   Age <dbl>, Target <dbl>, Available401K <dbl>, CustomerValueSegment <dbl>,
## #   ChurnScore <dbl>, CallActivity <dbl>
# lectura del archivo csv y eliminación de filas que contienen "NA"
read_csv("Demographics.csv") %>% drop_na()
## # A tibble: 18,479 x 13
##    CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##          <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
##  1       11001 S             M                 60000               3           3
##  2       11002 M             M                 60000               3           3
##  3       11005 S             M                 70000               0           0
##  4       11006 S             F                 70000               0           0
##  5       11007 M             M                 60000               3           3
##  6       11008 S             F                 60000               4           4
##  7       11009 S             M                 70000               0           0
##  8       11010 S             F                 70000               0           0
##  9       11011 M             M                 60000               4           4
## 10       11012 M             F                100000               2           0
## # … with 18,469 more rows, and 7 more variables: NumberOfContracts <dbl>,
## #   Age <dbl>, Target <dbl>, Available401K <dbl>, CustomerValueSegment <dbl>,
## #   ChurnScore <dbl>, CallActivity <dbl>

Fill

Esta función completa los valores NA con los valores adyacentes, se puede especificar la busqueda hacia arriba o abajo de la fila con NA. Si no se especifica una dirección se toma “down” por default.

  • down: llena los datos desde arriba hacia abajo
  • up: completa los datos desde abajo hacia arriba
  • downup: completa los datos faltantes en ambas direcciones.
  • updown: completa los datos faltantes en ambas direcciones.
fill(data, column, direction = c("down", "up", "downup", "updown"))
gapminder %>%
  fill(year)
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows

Replace_na

Permite reemplazar los valores NA con determinados valores predefinidos. Si el argumento de datos es un dataframe retorna un dataframe, si es un vector retorna un vector.

df <- tibble(read_csv("Demographics.csv") )
df %>% head()
## # A tibble: 6 x 13
##   CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##         <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
## 1       11000 M             M                    NA               2           0
## 2       11001 S             M                 60000               3           3
## 3       11002 M             M                 60000               3           3
## 4       11003 S             F                    NA               0           0
## 5       11004 S             F                 80000               5           5
## 6       11005 S             M                 70000               0           0
## # … with 7 more variables: NumberOfContracts <dbl>, Age <dbl>, Target <dbl>,
## #   Available401K <dbl>, CustomerValueSegment <dbl>, ChurnScore <dbl>,
## #   CallActivity <dbl>

Otra forma de eliminar aquellos valores ‘0’.

df %>% mutate(EstimatedYearlyIncome = replace_na(EstimatedYearlyIncome,0)) %>% head()
## # A tibble: 6 x 13
##   CustomerKey MaritalStatus Gender EstimatedYearly… SentimentRating WebActivity
##         <dbl> <chr>         <chr>             <dbl>           <dbl>       <dbl>
## 1       11000 M             M                     0               2           0
## 2       11001 S             M                 60000               3           3
## 3       11002 M             M                 60000               3           3
## 4       11003 S             F                     0               0           0
## 5       11004 S             F                 80000               5           5
## 6       11005 S             M                 70000               0           0
## # … with 7 more variables: NumberOfContracts <dbl>, Age <dbl>, Target <dbl>,
## #   Available401K <dbl>, CustomerValueSegment <dbl>, ChurnScore <dbl>,
## #   CallActivity <dbl>

Dplyr

El paquete dplyr entrega una serie de funciones muy útiles para la manipulación de data frames, permitiendo simplificar las acciones sobre este tipo de datos. Las funciones de Dplyr estan construidas en C++ y son por tanto bastante más rápidas. Este proporciona una serie de verbos o funciones que mejoran el acceso y manipulación de datos. Los principales son:

  • arrange
  • count
  • filter
  • group
  • mutate
  • rename
  • select
  • summarize
  • %>% (pipe)

Arrange()

Reordena los datos de una tabla en base a un conjunto de columnas o expresiones resultantes como criterio para la ordenación.

# desc() reordena en forma descendente (Z-A)
# arrange(dataframe, [col,])
arrange(gapminder, year, desc(pop)) %>% head()
## # A tibble: 6 x 6
##   country       continent  year lifeExp       pop gdpPercap
##   <fct>         <fct>     <int>   <dbl>     <int>     <dbl>
## 1 China         Asia       1952    44   556263527      400.
## 2 India         Asia       1952    37.4 372000000      547.
## 3 United States Americas   1952    68.4 157553000    13990.
## 4 Japan         Asia       1952    63.0  86459025     3217.
## 5 Indonesia     Asia       1952    37.5  82052000      750.
## 6 Germany       Europe     1952    67.5  69145952     7144.

Count()

Realiza una contabilidad de registros creando una nueva columna.

# cantidad de registros por continente
# count(col, sort=TRUE|FALSE, name="")
gapminder %>%
  count(continent, sort = TRUE, name="registros")
## # A tibble: 5 x 2
##   continent registros
##   <fct>         <int>
## 1 Africa          624
## 2 Asia            396
## 3 Europe          360
## 4 Americas        300
## 5 Oceania          24

Filter()

Selecciona un subconjunto de datos basados en una condición aplicada al set de datos originales.

# En el ejemplo siguiente se seleccionarán los registros del año 2007 exclusivamente.
# Uso de opción de acción directa:
# filter(gapminder,year == 2007) %>% head()

# Uso de opcion con pipe "%>%"
gapminder %>% filter(year == 2007) %>% head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       2007    43.8 31889923      975.
## 2 Albania     Europe     2007    76.4  3600523     5937.
## 3 Algeria     Africa     2007    72.3 33333216     6223.
## 4 Angola      Africa     2007    42.7 12420476     4797.
## 5 Argentina   Americas   2007    75.3 40301927    12779.
## 6 Australia   Oceania    2007    81.2 20434176    34435.

Esta forma es equivalente a la forma normal sin dplyr.

gapminder[gapminder$year==2007,] %>% head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       2007    43.8 31889923      975.
## 2 Albania     Europe     2007    76.4  3600523     5937.
## 3 Algeria     Africa     2007    72.3 33333216     6223.
## 4 Angola      Africa     2007    42.7 12420476     4797.
## 5 Argentina   Americas   2007    75.3 40301927    12779.
## 6 Australia   Oceania    2007    81.2 20434176    34435.
# Filtro múltiple: Seleccionar los registros del año 2007 correspondiente 
# solamente al continente americano.
america <- gapminder %>% filter(year == 2007, continent=="Americas") 
america
## # A tibble: 25 x 6
##    country            continent  year lifeExp       pop gdpPercap
##    <fct>              <fct>     <int>   <dbl>     <int>     <dbl>
##  1 Argentina          Americas   2007    75.3  40301927    12779.
##  2 Bolivia            Americas   2007    65.6   9119152     3822.
##  3 Brazil             Americas   2007    72.4 190010647     9066.
##  4 Canada             Americas   2007    80.7  33390141    36319.
##  5 Chile              Americas   2007    78.6  16284741    13172.
##  6 Colombia           Americas   2007    72.9  44227550     7007.
##  7 Costa Rica         Americas   2007    78.8   4133884     9645.
##  8 Cuba               Americas   2007    78.3  11416987     8948.
##  9 Dominican Republic Americas   2007    72.2   9319622     6025.
## 10 Ecuador            Americas   2007    75.0  13755680     6873.
## # … with 15 more rows
# Selecciona los registros de 2007 de Americas y luego genera un subconjunto de datos.
gapminder %>% 
  filter(year == 2007, continent=="Americas") %>%
  dplyr::select(country, lifeExp, pop, gdpPercap) %>%
  head()
## # A tibble: 6 x 4
##   country   lifeExp       pop gdpPercap
##   <fct>       <dbl>     <int>     <dbl>
## 1 Argentina    75.3  40301927    12779.
## 2 Bolivia      65.6   9119152     3822.
## 3 Brazil       72.4 190010647     9066.
## 4 Canada       80.7  33390141    36319.
## 5 Chile        78.6  16284741    13172.
## 6 Colombia     72.9  44227550     7007.

Group_by()

Crea un subconjunto de filas en un nuevo dataset en base a una agrupación de datos. Generalmente se usa en conjunto con summarize para obtener cálculos estadísticos de agrupaciones. Para esto primero se debe agrupar con group_by y posteriormente summarize.

library(scales)
# Determinación del promedio de expectativa de vida y total de población
# "signif" limita los decimales
gapminder %>% 
  group_by(year) %>%
  summarize(meanLifeExp = signif(mean(lifeExp), digits=4),
             totalPop = sum(as.numeric(pop))
  ) %>% 
 # fmt_number(columns = totalPop,
 #            decimals = 0) %>%
head()
## # A tibble: 6 x 3
##    year meanLifeExp   totalPop
##   <int>       <dbl>      <dbl>
## 1  1952        49.1 2406957150
## 2  1957        51.5 2664404580
## 3  1962        53.6 2899782974
## 4  1967        55.7 3217478384
## 5  1972        57.6 3576977158
## 6  1977        59.6 3930045807

Mutate()

Modifica y/o agrega nuevas variables (columnas) como resultados de funciones de variables previamente existentes.

# modifica columna "pop" dividiendo esta por 1 millón 
# agrega nueva columna "gdp" como resultante de gdpPercap * pop
gapminder %>% 
  mutate(pop = pop / 1000000, gdp = gdpPercap*pop) %>%
  head()
## # A tibble: 6 x 7
##   country     continent  year lifeExp   pop gdpPercap    gdp
##   <fct>       <fct>     <int>   <dbl> <dbl>     <dbl>  <dbl>
## 1 Afghanistan Asia       1952    28.8  8.43      779.  6567.
## 2 Afghanistan Asia       1957    30.3  9.24      821.  7585.
## 3 Afghanistan Asia       1962    32.0 10.3       853.  8759.
## 4 Afghanistan Asia       1967    34.0 11.5       836.  9648.
## 5 Afghanistan Asia       1972    36.1 13.1       740.  9679.
## 6 Afghanistan Asia       1977    38.4 14.9       786. 11698.
# Combinando las funciones mediante %>%
gapminder %>% 
  mutate(pop = pop / 1000000, gdp = gdpPercap*pop) %>%
  filter(year==1952, continent=="Americas") %>%
  arrange(desc(pop)) %>%
  head()
## # A tibble: 6 x 7
##   country       continent  year lifeExp   pop gdpPercap      gdp
##   <fct>         <fct>     <int>   <dbl> <dbl>     <dbl>    <dbl>
## 1 United States Americas   1952    68.4 158.     13990. 2204242.
## 2 Brazil        Americas   1952    50.9  56.6     2109.  119372.
## 3 Mexico        Americas   1952    50.8  30.1     3478.  104846.
## 4 Argentina     Americas   1952    62.5  17.9     5911.  105676.
## 5 Canada        Americas   1952    68.8  14.8    11367.  168070.
## 6 Colombia      Americas   1952    50.6  12.4     2144.   26481.

Rename()

Renombra las columnas de un dataset. No agrega nuevas columnas o altera el orden de las filas de la columna modificada. Utiliza el formato:

rename(dataframe, nuevo_nombe = antiguo_nombre)

y tiene una alternativa para realizar el cambio mediante una función.

rename_with(dataframe, función)

rename(gapminder, life=lifeExp, population=pop) %>% head()
## # A tibble: 6 x 6
##   country     continent  year  life population gdpPercap
##   <fct>       <fct>     <int> <dbl>      <int>     <dbl>
## 1 Afghanistan Asia       1952  28.8    8425333      779.
## 2 Afghanistan Asia       1957  30.3    9240934      821.
## 3 Afghanistan Asia       1962  32.0   10267083      853.
## 4 Afghanistan Asia       1967  34.0   11537966      836.
## 5 Afghanistan Asia       1972  36.1   13079460      740.
## 6 Afghanistan Asia       1977  38.4   14880372      786.
# cambio de nombre con función, cambia a mayúsculas los nombres de colummnas
rename_with(gapminder, toupper) %>% head()
## # A tibble: 6 x 6
##   COUNTRY     CONTINENT  YEAR LIFEEXP      POP GDPPERCAP
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.

Sample_n()

Captura una muestra aleatoria de datos en una cantidad fija desde un dataset. Donde los argumentos que utiliza son el dataframa y el numero de muestras a recolectar.

# recoge 5 datos aleatorios desde gapminder.
sample_n(gapminder, 5)
## # A tibble: 5 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Croatia     Europe     2002    74.9  4481020    11628.
## 2 Ecuador     Americas   1972    58.8  6298651     5281.
## 3 Congo, Rep. Africa     1987    57.5  2064095     4201.
## 4 Slovenia    Europe     1962    69.2  1582962     7402.
## 5 Guatemala   Americas   2007    70.3 12572928     5186.

Sample_frac()

Captura una muestra aleatoria de datos en una cantidad fija (%) desde un dataset.

sample_frac(gapminder, 0.2) %>% head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Spain       Europe     1997    78.8 39855442    20445.
## 2 Congo, Rep. Africa     1992    56.4  2409073     4016.
## 3 Serbia      Europe     1982    70.2  9032824    15181.
## 4 Eritrea     Africa     1957    38.0  1542611      344.
## 5 Puerto Rico Americas   1982    73.8  3279001    10331.
## 6 Gabon       Africa     1992    61.4   985739    13522.

Select()

Select tiene como función realizar un subconjunto de los datos de un data frame basados en la selección de un cierto conjunto de colummnas (variables) de el dataset original. Para ello utiliza como argumentos el dataset mismo y el conjunto de columnas.

El dataframe origen de la selección puede a su vez estar segmentado por ciertos filtros o funciones aplicadas a este, previo a realizar la selección de datos.

Existen funciones que complementan a select() y estas son: starts_with(), ends_with(), matches() y contains() para trabajar con grandes conjuntos de datos y variables.

# Seleccion sobre un dataset "gapminder", con ciertas columnas específicas.
select(gapminder, country, year,pop, gdpPercap) %>% head()
## # A tibble: 6 x 4
##   country      year      pop gdpPercap
##   <fct>       <int>    <int>     <dbl>
## 1 Afghanistan  1952  8425333      779.
## 2 Afghanistan  1957  9240934      821.
## 3 Afghanistan  1962 10267083      853.
## 4 Afghanistan  1967 11537966      836.
## 5 Afghanistan  1972 13079460      740.
## 6 Afghanistan  1977 14880372      786.
# También se puede generar sobre datos tratados previamente.
# Primero se filtra los datos por año y luego selecciona las columnas a mostrar.
dplyr::select(gapminder %>% filter(year == 2007), country,continent,pop, gdpPercap) %>% head()
## # A tibble: 6 x 4
##   country     continent      pop gdpPercap
##   <fct>       <fct>        <int>     <dbl>
## 1 Afghanistan Asia      31889923      975.
## 2 Albania     Europe     3600523     5937.
## 3 Algeria     Africa    33333216     6223.
## 4 Angola      Africa    12420476     4797.
## 5 Argentina   Americas  40301927    12779.
## 6 Australia   Oceania   20434176    34435.
# Aplicar doble filtro, year y continente antes de seleccionar las columnas requeridas.
dplyr::select(gapminder %>% 
  filter(year == 2007, continent=="Asia"), country, lifeExp, pop, gdpPercap) %>% 
  head()
## # A tibble: 6 x 4
##   country          lifeExp        pop gdpPercap
##   <fct>              <dbl>      <int>     <dbl>
## 1 Afghanistan         43.8   31889923      975.
## 2 Bahrain             75.6     708573    29796.
## 3 Bangladesh          64.1  150448339     1391.
## 4 Cambodia            59.7   14131858     1714.
## 5 China               73.0 1318683096     4959.
## 6 Hong Kong, China    82.2    6980412    39725.

Summarize()

Condensa múltiples valores en un único valor. Puede usarse con las funciones “mean”, “sum”, “median”, “min” y “max”.

# promedio de expectativa de vida y población total en el año 2007
gapminder %>%
  filter(year == 2007) %>% 
  summarize(meanLifeExp = mean(lifeExp),
            totalPop = sum(as.numeric(pop))
  )
## # A tibble: 1 x 2
##   meanLifeExp   totalPop
##         <dbl>      <dbl>
## 1        67.0 6251013179

Transmute()

Realiza modificaciones manteniendo solamente las variables creadas y omitiendo las restantes.

gapminder %>%
  transmute(population = pop /1000000, lifeExp) %>% head()
## # A tibble: 6 x 2
##   population lifeExp
##        <dbl>   <dbl>
## 1       8.43    28.8
## 2       9.24    30.3
## 3      10.3     32.0
## 4      11.5     34.0
## 5      13.1     36.1
## 6      14.9     38.4

Forcats

Trabaja con variables categóricas que R utiliza como factores. Variables limitadas a un cierto rango de valores.

  • fct_reorder(): Reordering a factor by another variable.
  • fct_infreq(): Reordering a factor by the frequency of values.
  • fct_relevel(): Changing the order of a factor by hand.
  • fct_lump(): Collapsing the least/most frequent values of a factor into “other”.

Más información en:

https://forcats.tidyverse.org/articles/forcats.html

library(forcats)

# gapminder %>%
#  mutate(continente = fct_infreq(continent))

Ggplot2

Es una librería de amplio uso en la visualización de datos. Mayor información detallada en un proximo artículo de “Ggplot2 Fundamental”.

Más información en:

ggplot(dataset, estetica) + geometría + opciones + facetas

  • Dataset: siempre una tabla de datos.
  • Estética, aporta elementos para mostrar gráficamente (la posición x e y, el color, etc.) y especifica las columnas de el dataset.
  • Geometrías (o capas): define el tipo de gráfico a representar.
  • Opciones: agrega oros elementos adicionales que permiten mejorar el diseño del gráfico.
  • Facetas: parten un gráfico en sublienzos preservando las escalas (pequeños múltiplos)

Estética:

aes(argumentos) donde argumentos puede involucrar:

# x = columna1, y = columna2
# color = continent
# size = pop

Modalidades:

  • geom_point() : dispersiograma
  • geom_line() : lineas
  • geom_col() : columnas
  • geom_histogram() : histogramas
  • geom_boxplot() : boxplot

Las “opciones” incluyen:

# expand_limits(y = 0) :  
# scale_x_log10() : escala logaritmica para el eje x
# scale_y_log10() : escala logaritmica para el eje y
library('ggplot2')
# Creación de un subset con los datos de 1952
gapminder_1952 <- gapminder %>% filter(year == 2007)
# Graficar expectativa de vida "lifeExp" vs ingreso por cápita "gdpPercap"
ggplot(gapminder_1952, 
       aes(x = gdpPercap, y = lifeExp, 
       color = continent, # aplica colores basado en agrupacón de continentes
       size = pop)) + #define el tamaño de los puntos en base a población
  geom_point() +
  scale_x_log10() + 
# opcional
  labs(
    title = "Life expectative vs Ingreso per capita",
    subtitle = "year 1952",
    caption = " Summary of data, ref 1952 -2007",
    x = "Ingreso per cápita",
    y = "Life Expectative"
  )

library('ggplot2')
# Creación de un subset con los datos de 1952
gapminder_1952 <- gapminder %>% filter(year == 2007)

# Graficar expectativa de vida "lifeExp" vs ingreso por cápita "gdpPercap"
ggplot(gapminder_1952, 
       aes(x = gdpPercap, y = lifeExp, 
           color = continent,
           size = pop)) + 
  geom_point() +
  scale_x_log10() +
  facet_wrap(~ continent)

Purrr

Purrr provee de una serie de herramientas para la programación funcional y mejora el trabajo con funciones y vectores. Mejora el acceso a elementos dentro de un ciclo (loop) y el acceso a listas.

Una iteración siempre es del tipo:

# datos <- vector("integer", ncol(gapminder)) # 1. salida
# datos <-integer() # en caso de desconocer la cantidad final
# for (i in seq_along(gapminder)) {           # 2. secuencia
#  output[[i]] <- median(df[[i]])            # 3. cuerpo de la iteración
#}

Donde debe especificarse la salida previa para disponer de suficiente espacio. el tipo puede ser logical, integer, double o character.

map()

Estas funciones aplican una función a cada elemento de una lista. Posee diversas variaciones: map_lgl(), map_int(), map_doubl(), map_chr() que retornan un objeto del tipo que indican.

Argumentos:

map(x, function, …)

  • donde x es una lista o un vector.
  • function es una función, formula o un vector. Si es una formula (x+2) se convieerte en una función.

https://purrr.tidyverse.org/

#determinar la cantidad de valores distintos en cada columna con n_distinct(), usamos map_dbl ya que n_distinct retorna un numero de tipo doble.
gapminder %>% map_dbl(n_distinct)
##   country continent      year   lifeExp       pop gdpPercap 
##       142         5        12      1626      1704      1704
#detectar el tipo de cada columna
gapminder %>% map_chr(class)
##   country continent      year   lifeExp       pop gdpPercap 
##  "factor"  "factor" "integer" "numeric" "integer" "numeric"
# promedio de expextativa de vida agrupado por continente. En este caso el punto "." es una abreviación del uso del dataframe gapminder.
gapminder %>% split(.$continent) %>%
  map(~ mean(.$lifeExp))
## $Africa
## [1] 48.86533
## 
## $Americas
## [1] 64.65874
## 
## $Asia
## [1] 60.0649
## 
## $Europe
## [1] 71.90369
## 
## $Oceania
## [1] 74.32621

Stringr

Permite una serie de funciones sobre caracteres, haciendo la manipulación de string más eficiente.

str_c()

Genera un caden de texto con separador indicado en argumento collapse.

str_c(america$country, collapse = ", ")
## [1] "Argentina, Bolivia, Brazil, Canada, Chile, Colombia, Costa Rica, Cuba, Dominican Republic, Ecuador, El Salvador, Guatemala, Haiti, Honduras, Jamaica, Mexico, Nicaragua, Panama, Paraguay, Peru, Puerto Rico, Trinidad and Tobago, United States, Uruguay, Venezuela"

str_detect()

Busca la ocurrencia del patron dentro del texto: str_detect(texto, patron)

str_detect(america$country, "[zy]")
##  [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
## [25]  TRUE

str_count()

Contabiliza el número de ocurrencias del patrón dentro de el texto.

str_count(america$country, "[zy]")
##  [1] 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1

str_locate()

Busca en qué posición se ecnuentra el patrón indicado.

str_locate(america$country, "[zy]")
##       start end
##  [1,]    NA  NA
##  [2,]    NA  NA
##  [3,]     4   4
##  [4,]    NA  NA
##  [5,]    NA  NA
##  [6,]    NA  NA
##  [7,]    NA  NA
##  [8,]    NA  NA
##  [9,]    NA  NA
## [10,]    NA  NA
## [11,]    NA  NA
## [12,]    NA  NA
## [13,]    NA  NA
## [14,]    NA  NA
## [15,]    NA  NA
## [16,]    NA  NA
## [17,]    NA  NA
## [18,]    NA  NA
## [19,]     8   8
## [20,]    NA  NA
## [21,]    NA  NA
## [22,]    NA  NA
## [23,]    NA  NA
## [24,]     7   7
## [25,]     5   5

str_replace()

Reemplaza el texto seleccionado mediante un patrón: str_replace(x, pattern, replacement)

str_replace(america$country, "[aeiou]", "?")
##  [1] "Arg?ntina"           "B?livia"             "Br?zil"             
##  [4] "C?nada"              "Ch?le"               "C?lombia"           
##  [7] "C?sta Rica"          "C?ba"                "D?minican Republic" 
## [10] "Ec?ador"             "El S?lvador"         "G?atemala"          
## [13] "H?iti"               "H?nduras"            "J?maica"            
## [16] "M?xico"              "N?caragua"           "P?nama"             
## [19] "P?raguay"            "P?ru"                "P?erto Rico"        
## [22] "Tr?nidad and Tobago" "Un?ted States"       "Ur?guay"            
## [25] "V?nezuela"

str_split()

Realiza una separación del texto según un caracter delimitador.

str_split(c("a,b", "c,d,e"), ",")
## [[1]]
## [1] "a" "b"
## 
## [[2]]
## [1] "c" "d" "e"

Para un detalle de cada función disponible revise la hoja de atajos:

cheat sheet: https://github.com/rstudio/cheatsheets/blob/master/strings.pdf

Tibble

Es una moderna reimaginación del marco de datos, manteniendo lo que el tiempo ha demostrado ser efectivo, y desechando lo que no lo es. Tibbles son data.frames que son perezosos y malhumorados: hacen menos (es decir, no cambian los nombres o tipos de variables, y no hacen coincidencias parciales) y sse quejan más (por ejemplo, cuando una variable no existe). Esto les obliga a enfrentarse a los problemas antes, lo que normalmente conduce a un código más limpio y expresivo.

Tibbles también tiene un método print() mejorado que hace más fácil su uso con grandes conjuntos de datos que contienen objetos complejos.

Proporciona además una nueva clase de objeto tabular de datos. tibble el que hereda de la calse data frame y realiza algunas mejoras:

  • Siempre retorna un tibble.
  • Siempre utiliza el nombre completo de las columnas.
  • Presenta una vista más consistente de los datos en formato de tabla.
  • Mejora el control de la apariencia mediante opciones.
  • Es reversible a data frame con as.data.frame()
library(tibble)
as_tibble(gapminder) %>% head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.

Tibble se puede aplicar sobre dataframes, listas, matrices o tablas. Además, se puede crear desde vectores.

tibble(x = 1:5, y = 1, z = x ^ 2 + y)
## # A tibble: 5 x 3
##       x     y     z
##   <int> <dbl> <dbl>
## 1     1     1     2
## 2     2     1     5
## 3     3     1    10
## 4     4     1    17
## 5     5     1    26

También se puede definir un objeto línea a línea con tribble():

tribble(
  ~x, ~y,  ~z,
  "a", 2,  3.6,
  "b", 1,  8.5
)
## # A tibble: 2 x 3
##   x         y     z
##   <chr> <dbl> <dbl>
## 1 a         2   3.6
## 2 b         1   8.5

Tidyr

Tidyr permite facilitar la creación de datos donde cada columna es una variable, cada fila es una observación y cada celda tiene un valor único.

Permite organizar datos tabulares. Provee una estructura consistente de datos a través de todos los paquetes de tidyverse.

Accede fácilmente a las variables como vectores, preservando los casos de cada fila.

Requerimientos

Los datos considerados como tabulares para su uso en tidyr deben cumplir con lo siguiente:

  • cada variable corresponde a una columna.
  • cada observación, caso o registro es una línea de la tabla.

las funciones esenciales de Tidyr se agrupan en 5 áreas: Pivoting para transformar tablas en cuanto a su disposición, ancho o largo; Rectangular o crear tablas desde listas anidadas (ejemplo datos en JSON); Anidar grupos de datos; Combinar valores de columnas de caracteres; Determinar valores de valores perdidos (missing values) en forma explicita.

gather()

Reorganiza los datos en una tabla para que conformen la necesidad de estar en forma tabulada (tidy).

spread()

Transforma los datos de una tabla (data frame) en una nueva organizada en nuevas columnas.

separate()

Permite separar los valores de una columna, basado en un caracter que actúa como separador. Se utiliza frecuentemente en valores de tipo caracter.

separate(datos, columna, c(“nueva1”, “nueva2”, “nuevan”), sep = “-”)

separate(gapminder, fecha, c("year", "month", "day"), sep = "-")

Si tenemos una columna direccion con valores llenados del tipo “direccíon, locación/ciudad, comuna” y deseamos separarlas para obtener en forma separada la ciudad y comuna establecemos:

ejemplo:“colo colo 357 depto. 33A, San Pedro Costa, San Pedro de la Paz”

separate(clientes, direccion, c("dirección", "locacion", "comuna"), sep = ",")

unite()

Función recíproca de separate() que unifica en una nueva columna otras existentes.

# fusiona tres columnas: year, month y day en una nueva columna "fecha".
unite(datos, "fecha", year, month, day, sep = "-")

pivot

Las funciones pivot cambian las posiciones entre filas y columnas. rotando en 90 grados.

pivot_longer()

Transforma una agrupacion de datos en tabla aumentando el numero de filas y reduciendo la cantidad de columnas. Pivot es entendida como girar una tabla desplazando sus filas y columnas.

https://tidyr.tidyverse.org/reference/pivot_longer.html

# tabla original
gapminder %>% filter(continent=="Asia") 
## # A tibble: 396 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 386 more rows
# relig_income es un dataset de una encuesta de ingresos vs religión, donde en columnas se establece la categoría de ingreso.
relig_income %>% head()
## # A tibble: 6 x 11
##   religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k` `$75-100k`
##   <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>      <dbl>
## 1 Agnostic      27        34        60        81        76       137        122
## 2 Atheist       12        27        37        52        35        70         73
## 3 Buddhist      27        21        30        34        33        58         62
## 4 Catholic     418       617       732       670       638      1116        949
## 5 Don’t k…      15        14        15        11        10        35         21
## 6 Evangel…     575       869      1064       982       881      1486        949
## # … with 3 more variables: `$100-150k` <dbl>, `>150k` <dbl>, `Don't
## #   know/refused` <dbl>
# Se utiliza para el cambio todas las columnas a excepción de religion (!religion)
# names_to determina la columna a ser creada y values_to el tipo de valor en las celdas
relig_income %>% pivot_longer(cols= !religion, names_to = "Income", values_to = "Count")
## # A tibble: 180 x 3
##    religion Income             Count
##    <chr>    <chr>              <dbl>
##  1 Agnostic <$10k                 27
##  2 Agnostic $10-20k               34
##  3 Agnostic $20-30k               60
##  4 Agnostic $30-40k               81
##  5 Agnostic $40-50k               76
##  6 Agnostic $50-75k              137
##  7 Agnostic $75-100k             122
##  8 Agnostic $100-150k            109
##  9 Agnostic >150k                 84
## 10 Agnostic Don't know/refused    96
## # … with 170 more rows

https://www.storybench.org/pivoting-data-from-columns-to-rows-and-back-in-the-tidyverse/

pivot_wider()

Realiza la transformación inversa a pivot_longer() y genera un dataframe más ancho que alto. Transformando valores de filas a más columnas.

# tabla original con year en una columna.
gapminder %>% head()
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.
# crea una selección de campos para establecer el gdpPercap en base a los años entre 1952 y 2007 
# en columna y el valor gdpPerCap como valor de cada celda
gapminder %>% select(country, year, gdpPercap) %>%
pivot_wider(names_from = year, values_from=gdpPercap) %>% head()
## # A tibble: 6 x 13
##   country `1952` `1957` `1962` `1967` `1972` `1977` `1982` `1987` `1992` `1997`
##   <fct>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 Afghan…   779.   821.   853.   836.   740.   786.   978.   852.   649.   635.
## 2 Albania  1601.  1942.  2313.  2760.  3313.  3533.  3631.  3739.  2497.  3193.
## 3 Algeria  2449.  3014.  2551.  3247.  4183.  4910.  5745.  5681.  5023.  4797.
## 4 Angola   3521.  3828.  4269.  5523.  5473.  3009.  2757.  2430.  2628.  2277.
## 5 Argent…  5911.  6857.  7133.  8053.  9443. 10079.  8998.  9140.  9308. 10967.
## 6 Austra… 10040. 10950. 12217. 14526. 16789. 18334. 19477. 21889. 23425. 26998.
## # … with 2 more variables: `2002` <dbl>, `2007` <dbl>
# idem a lo anterior pero esta vez colocamos como valor la expectativa de vida.
gapminder %>% select(country, year, lifeExp) %>%
pivot_wider(names_from = year, values_from=lifeExp) %>% head()
## # A tibble: 6 x 13
##   country `1952` `1957` `1962` `1967` `1972` `1977` `1982` `1987` `1992` `1997`
##   <fct>    <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 Afghan…   28.8   30.3   32.0   34.0   36.1   38.4   39.9   40.8   41.7   41.8
## 2 Albania   55.2   59.3   64.8   66.2   67.7   68.9   70.4   72     71.6   73.0
## 3 Algeria   43.1   45.7   48.3   51.4   54.5   58.0   61.4   65.8   67.7   69.2
## 4 Angola    30.0   32.0   34     36.0   37.9   39.5   39.9   39.9   40.6   41.0
## 5 Argent…   62.5   64.4   65.1   65.6   67.1   68.5   69.9   70.8   71.9   73.3
## 6 Austra…   69.1   70.3   70.9   71.1   71.9   73.5   74.7   76.3   77.6   78.8
## # … with 2 more variables: `2002` <dbl>, `2007` <dbl>