Documento 3 Paquete Dplyr - Breast-cancer.data
3.1 Teoría
- Usar el paquete
dplyr
, otro de los paquetes centrales del denominado tidyverse. - En
tidyverse
-dplyr
- Instalar
tidyverse
- Cargar paquete
tidyverse
5 funciones clave de dplyr
:
- Escoger observaciones (filas) según sus valores (
filter()
). - Reordenar las filas (
arrange()
). - Seleccionar variables por su nombre (
select()
). - Crear nuevas variables como función de variables ya existentes (mutate()).
- Encontrar valores representativos de cada variable (
summarise()
).
Todos estos verbos funcionan de la misma manera:
- El primer argumento es un dataframe.
- Los demás argumentos describen qué hacer con el dataframe, usando los nombres de las variables (columnas) sin necesidad de utilizar comillas.
- El resultado es un nuevo dataframe.
3.1.1 filter()
filter()
extrae un subconjunto de las observaciones (filas), basándose en los valores de una o más columnas.
Argumentos: - nombre del dataframe - expresiones (lógicas) para filtrar el dataframe
3.1.2 top_n()
re-ordenación por una variable y sólo tomar los n
valores más altos o más bajos:
- nombre del dataframe,
n
, el número de elementos que recuperar (n negativo los n más bajos)- el nombre de la variable por la que ordenar
3.1.3 select()
Seleccionar únicamente aquellas variables en las que estamos interesados - ayuda - select(dataset, col1, col2, col3)
Ejemplos:
Seleccionar del dataset las columnas clase, tamaño de tumor y grado de tumor
Podemos seleccionar intervalos de columnas (de col1 a col4):
- ‘deseleccionar’ columnas
Otra utilidad de select()
, conjuntamente con la función everything()
, es mover algunas columnas o variables al principio del dataframe.
Otras funciones auxiliares, además del mencionado everything()
, que nos pueden ser de ayuda a la hora de seleccionar columnas:
starts_with('abc')
: encuentra todas las columnas cuyo nombre comienza por “abc”.ends_with('xyz')
: encuentra todas las columnas cuyo nombre termina en “xyz”.contains('ijk')
: para seleccionar las columnas cuyo nombre contenga la cadena de caracteres “ijk”.
Y otras funciones más complejas (que filtran las columnas por expresiones regulares), que se pueden ver al hacer select
.
3.1.4 mutate()
El verbo mutate()
se usa para añadir (o renombrar) nuevas columnas al final del dataframe.
Por ejemplo, añadimos columna dist_grado_peor que es 4.
3.1.5 transmute()
Si sólo se desea guardar las nuevas variables, se puede usar la función transmute()
:
3.1.6 rename()
- función
rename()
, que, internamente, se comporta comoselect()
, pero guardando todas las variables que no se mencionan explícitamente:
3.1.7 Uso del operador %>%
‘%>%’ utiliza la salida del término que hay a la izquierda del símbolo ‘%>%’ como primer argumento de la función que está a la derecha de dicho símbolo.
x %>% f(y)
es igual que hacerf(x, y)
3.2 Ejercicios
Descargamos en local breast-cancer.data, y breast-cancer.names1.csv (nombres de las columnas).
A continuación, importamos en R el fichero breast-cancer.data y colocamos los nombres al dataset que están en breast-cancer.names1.csv.
cancer <- read.csv("datasets/breast-cancer.data", header=FALSE)
nombres <- read.csv("datasets/breast-cancer.names1.csv", header=FALSE)
names(cancer) <- nombres[, 1]
Los apartados pedidos son los siguientes:
- Extraer las filas del dataset que tienen cancer en el pecho izquierdo, no radiadas y de edad 40 a 49.
- Reordenar el dataset según el tamaño del tumor.
¡No se ordena de manera correcta (5-9)!
## [1] "0-4" "10-14" "15-19" "20-24" "25-29" "30-34" "35-39" "40-44" "45-49"
## [10] "5-9" "50-54"
cancer$tumor_size <- factor(cancer$tumor_size, ordered = TRUE, levels = c("0-4", "5-9", "10-14", "15-19", "20-24", "25-29", "30-34", "35-39", "40-44", "45-49", "50-54"))
levels(cancer$tumor_size)
## [1] "0-4" "5-9" "10-14" "15-19" "20-24" "25-29" "30-34" "35-39" "40-44"
## [10] "45-49" "50-54"
- Reordenar el dataset según el tamaño del tumor y el grado de que tiene el tumor.
- Reordenar el dataset según el tamaño del tumor (pero descendiente) y el grado de maligno que tiene el tumor.
- Extraer los 10 pacientes con pre-menopausia, con mayor tamaño de tumor y menor número de nodos invasores y ordenados por edad.
## [1] "0-2" "12-14" "15-17" "24-26" "3-5" "6-8" "9-11"
cancer$inv_nodes <- factor(cancer$inv_nodes, ordered = TRUE, levels = c("0-2", "3-5", "6-8", "9-11", "12-14", "15-17", "24-26"))
levels(cancer$inv_nodes)
## [1] "0-2" "3-5" "6-8" "9-11" "12-14" "15-17" "24-26"
e5 <- cancer %>%
filter(menopause == "premeno") %>%
select(menopause, tumor_size, inv_nodes, age) %>%
top_n(10, tumor_size) %>%
top_n(-10, inv_nodes) %>%
arrange(age)
paged_table(e5[2:11, ])