A.4 Cap. 6: Manejo de datos con tidyverse
- Carga la base de datos
aids
de la librería boot. Se pretenden obtener el promedio de las columnasdelay
,dud
,time
ey
, por cuarto (quarter
) y por año (year
). Asegúrate de que la tabla esté reordenada de menor a mayor por año (year
) y por cuarto (quarter
).
Solución:
library(boot)
data("aids")
### Resultado
%>%
aids group_by(year, quarter) %>%
summarise_at(.vars = vars(delay, dud, time, y),
.funs = lst(mean), na.rm=TRUE) %>%
arrange(year, quarter)
# # A tibble: 38 × 6
# # Groups: year [10]
# year quarter delay_mean dud_mean time_mean y_mean
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1983 3 20.1 0 1 0.8
# 2 1983 4 20.1 0 2 0.8
# 3 1984 1 20.1 0 3 0.933
# 4 1984 2 20.1 0 4 1
# 5 1984 3 20.1 0 5 2
# 6 1984 4 20.1 0 6 2.6
# # … with 32 more rows
- Utilizando la base de dato
aids
, encuentra cuales son los años (o el año) en que se tuvieron valores mayores igual a 30 entime
y valores de mayores a 25 endelay
.
Solución:
library(boot)
data("aids")
### Resultado
%>%
aids filter(time >= 30 & delay > 25) %>%
pull(year) %>%
unique()
# [1] 1990 1991 1992
Probablemente llegaste por tu cuenta hasta el uso de
filter()
. La función pull()
extrae una columna como un vector de datos. Es muy útil cuando se desea trabajar con un vector resultante y no con una data frame. La función unique()
devuelve los valores únicos de un vector, por ello el resultado impreso es solamente 1992
.
- La función
grepl()
provee una manera muy interesante de filtrar filas. Permite especificar un texto que será buscado dentro de cada palabra en cada celda de dicha columna, para filtrar las filas que contengan dicha cadena de texto. Pueden ser solo letras consecutivas, una palabras completa, etc. Usandogrepl()
dentro de la funciónfilter()
, se filtrarán las filas que coincidan con la búsqueda hecha porgrepl()
. Una vez entendido el uso de la funcióngrepl()
, instala y activa la libreríagapminder
, y carga la base de datos del mismo nombre. Filtra las filas que en la columnacountry
tengan el patrón de texto “ru”. Luego, realiza una segunda pipeline para realizar lo mismo pero ahora con el patrón “nia”, indicando que se ignore mayúsculas o minúsculas.
### Conjunto de datos
<- c("Andrea","Breta","Mark","Elon")
vector
### Buscar la letra A mayúscula en los elementos del vector
grepl("A", vector)
# [1] TRUE FALSE FALSE FALSE
### Buscar la letra A (mayúscula o minúscula) en los elementos del vector
grepl("A", vector, ignore.case = TRUE)
# [1] TRUE TRUE TRUE FALSE
### Buscar re mayúscula en los elementos del vector
grepl("re", vector)
# [1] TRUE TRUE FALSE FALSE
### Inicia el ejercicio con la instalación de gapminder
install.packages("gapminder")
library(gapminder)
Solución:
library(gapminder)
data("gapminder")
# Resolución
%>%
gapminder filter(grepl("ru",country)) %>%
pull(country) %>%
unique()
# [1] Burundi Peru Uruguay
# 142 Levels: Afghanistan Albania Algeria Angola Argentina Australia ... Zimbabwe
%>%
gapminder filter(grepl("nia",country, ignore.case = TRUE)) %>%
pull(country) %>%
unique()
# [1] Albania Bosnia and Herzegovina Mauritania
# [4] Romania Slovenia Tanzania
# 142 Levels: Afghanistan Albania Algeria Angola Argentina Australia ... Zimbabwe
- Carga la base de datos
breslow
de la librería boot. Esta base contiene información sobre el estatus de fumador/no fumador y edad de varios pacientes. Filtra las filas de las personas fumadoras (1
) en la columnasmoke
que tenganage
(edad) mayor a 40. Si realizas el ejercicio y no te funciona, la respuesta no era tan sencilla como aparenta. Revisar lastr()
de una base de datos es crucial siempre, aquí ayuda a entender que originalmenteage
es un factor, y debería ser numérica para aplicarle el filtrado con mayor a 40. Algo similar pasa consmoke
, es numérica y debe ser un factor. Utiliza la función respectiva de dplyr para transformar estas columnas. Aquí el truco paraage
es primero convertirla de factor a character, y luego a numeric. Pasar de factor directamente a numeric puede hacer que se pierda la información. Juega un poco con la base y notarás estos problemas.
Solución:
library(boot)
data("breslow")
### Revisar su estructura
str(breslow)
# 'data.frame': 10 obs. of 5 variables:
# $ age : Factor w/ 5 levels "40","50","60",..: 1 2 3 4 5 1 2 3 4 5
# $ smoke: num 0 0 0 0 0 1 1 1 1 1
# $ n : num 18790 10673 5710 2585 1462 ...
# $ y : num 2 12 28 28 31 32 104 206 186 102
# $ ns : num 0 0 0 0 0 ...
### Resolver el problema
%>%
breslow mutate(age = as.character(age),
age = as.numeric(age),
smoke = as.factor(smoke)) %>%
filter(smoke=="1" & age > 40)
# age smoke n y ns
# 7 50 1 43248 104 43248
# 8 60 1 28612 206 28612
# 9 70 1 12663 186 12663
# 10 80 1 5317 102 5317
- Carga la base de datos
population
de la librería tidyr. Identifica cuales son los seis países con mayor población (asegúrate de expresarlo en millones) en 1995, y luego en 2007. ¿Cambió algún país en la lista del top 6 ordenada de mayor a menor?
Solución:
library(tidyr)
data("population")
### Resultado para 1995
<- population %>%
Tabla_A filter(year == 1995) %>%
mutate(Millones = population/1000000) %>%
arrange(desc(population)) %>%
head()
### Resultado para 2007
<-population %>%
Tabla_B filter(year == 2007) %>%
mutate(Millones = population/1000000) %>%
arrange(desc(population)) %>%
head()
### Utilizando anti_join() para ver las filas
### de Tabla_A que no aparecen en Tabla_B
### o por decirlo diferente, las filas exclusivas de Tabla_A
anti_join(Tabla_A, Tabla_B, by="country")
# # A tibble: 1 × 4
# country year population Millones
# <chr> <int> <int> <dbl>
# 1 Russian Federation 1995 148602147 149.
# Respuesta: sí, cambió la Federación Rusa por Pakistán.