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:
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:
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.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 ...
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 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:
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
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.
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>
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")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>
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
# )Para la lectura de archivos separados por TAB.
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
Este proceso es relevante en el análisis de datos
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>
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.
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
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>
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:
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.
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
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.
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
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.
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.
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.
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 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.
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
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
Trabaja con variables categóricas que R utiliza como factores. Variables limitadas a un cierto rango de valores.
Más información en:
https://forcats.tidyverse.org/articles/forcats.html
library(forcats)
# gapminder %>%
# mutate(continente = fct_infreq(continent))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
Estética:
aes(argumentos) donde argumentos puede involucrar:
# x = columna1, y = columna2
# color = continent
# size = popModalidades:
Las “opciones” incluyen:
# expand_limits(y = 0) :
# scale_x_log10() : escala logaritmica para el eje x
# scale_y_log10() : escala logaritmica para el eje ylibrary('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 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.
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, …)
#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
Permite una serie de funciones sobre caracteres, haciendo la manipulación de string más eficiente.
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"
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
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
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
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"
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
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:
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 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:
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.
Reorganiza los datos en una tabla para que conformen la necesidad de estar en forma tabulada (tidy).
Transforma los datos de una tabla (data frame) en una nueva organizada en nuevas columnas.
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 = ",")
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 = "-")
Las funciones pivot cambian las posiciones entre filas y columnas. rotando en 90 grados.
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/
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>