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
library(dplyr)
library(tidyverse)
library(rmarkdown)

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):

s1 <- select(cancer, col1:col4)
s1
  • ‘deseleccionar’ columnas
select(cancer, -c(Class))

Otra utilidad de select(), conjuntamente con la función everything(), es mover algunas columnas o variables al principio del dataframe.

select(cancer, irradiat, inv_nodes, everything())

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.

brcan_data <- mutate(cancer,
       dist_grado_peor = 4-deg_malig
)

3.1.5 transmute()

Si sólo se desea guardar las nuevas variables, se puede usar la función transmute():

brcan_data <- transmute(cancer,
       dist_grado_peor = 4-deg_malig
)

3.1.6 rename()

  • función rename(), que, internamente, se comporta como select(), pero guardando todas las variables que no se mencionan explícitamente:
rename(brcan_data, dist_degree_worst = dist_grado_peor)

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 hacer f(x, y)

brcan_data %>% 
  filter(breast == "left")
br1 <- brcan_data %>% 
  filter(breast == "left" & age == "30-39") %>% 
  select(deg_malig, tumor_size, everything()) %>% 
  arrange(desc(deg_malig),tumor_size)  
  br1[1:5,]
cancer %>% 
  filter(breast == "left" & age == "30-39") %>% 
  top_n(5, deg_malig)
brcan_data %>% 
  filter(breast == "left" & age == "30-39") %>% 
  select(age,tumor_size,deg_malig) %>% 
  top_n(5,desc(deg_malig))

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]
paged_table(cancer)



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.
e1 <- cancer %>% 
  filter(breast == "left" & irradiat == "no" & age == "40-49")

paged_table(e1)


- Reordenar el dataset según el tamaño del tumor.

e2 <- cancer %>% 
  arrange(tumor_size)

paged_table(e2)


¡No se ordena de manera correcta (5-9)!

levels(cancer$tumor_size)
##  [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"
e2 <- cancer %>% 
  arrange(tumor_size)

paged_table(e2)


  • Reordenar el dataset según el tamaño del tumor y el grado de que tiene el tumor.
e3 <- cancer %>% 
  arrange(tumor_size, deg_malig)

paged_table(e3)


  • Reordenar el dataset según el tamaño del tumor (pero descendiente) y el grado de maligno que tiene el tumor.
e4 <- cancer %>% 
  arrange(desc(tumor_size), deg_malig)

paged_table(e4)


  • Extraer los 10 pacientes con pre-menopausia, con mayor tamaño de tumor y menor número de nodos invasores y ordenados por edad.
levels(cancer$inv_nodes)
## [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, ])