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)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<fctr>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events30-39premeno30-340-2no3leftleft_lowno
no-recurrence-events40-49premeno20-240-2no2rightright_upno
no-recurrence-events40-49premeno20-240-2no2leftleft_lowno
no-recurrence-events60-69ge4015-190-2no2rightleft_upno
no-recurrence-events40-49premeno0-40-2no2rightright_lowno
no-recurrence-events60-69ge4015-190-2no2leftleft_lowno
no-recurrence-events50-59premeno25-290-2no2leftleft_lowno
no-recurrence-events60-69ge4020-240-2no1leftleft_lowno
no-recurrence-events40-49premeno50-540-2no2leftleft_lowno
no-recurrence-events40-49premeno20-240-2no2rightleft_upno



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)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<fctr>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events40-49premeno20-240-2no2leftleft_lowno
no-recurrence-events40-49premeno50-540-2no2leftleft_lowno
no-recurrence-events40-49premeno0-40-2no3leftcentralno
no-recurrence-events40-49premeno30-340-2no3leftleft_upno
no-recurrence-events40-49premeno15-190-2no2leftleft_lowno
no-recurrence-events40-49premeno25-290-2no2leftleft_upno
no-recurrence-events40-49premeno10-140-2no2leftleft_lowno
no-recurrence-events40-49premeno30-340-2no1leftleft_lowno
no-recurrence-events40-49premeno10-140-2no2leftleft_upno
no-recurrence-events40-49premeno20-240-2no2leftcentralno


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

e2 <- cancer %>% 
  arrange(tumor_size)

paged_table(e2)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<fctr>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events40-49premeno0-40-2no2rightright_lowno
no-recurrence-events40-49premeno0-40-2no3leftcentralno
no-recurrence-events50-59ge400-40-2no2leftcentralno
no-recurrence-events50-59ge400-40-2no1rightcentralno
no-recurrence-events50-59ge400-40-2no1leftleft_lowno
no-recurrence-events70-79ge400-40-2no1leftright_lowno
no-recurrence-events30-39premeno0-40-2no2rightcentralno
recurrence-events30-39premeno0-40-2no2rightcentralno
no-recurrence-events60-69lt4010-140-2no1leftright_upno
no-recurrence-events50-59premeno10-140-2no3leftleft_lowno


¡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)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<ord>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events40-49premeno0-40-2no2rightright_lowno
no-recurrence-events40-49premeno0-40-2no3leftcentralno
no-recurrence-events50-59ge400-40-2no2leftcentralno
no-recurrence-events50-59ge400-40-2no1rightcentralno
no-recurrence-events50-59ge400-40-2no1leftleft_lowno
no-recurrence-events70-79ge400-40-2no1leftright_lowno
no-recurrence-events30-39premeno0-40-2no2rightcentralno
recurrence-events30-39premeno0-40-2no2rightcentralno
no-recurrence-events60-69ge405-90-2no1leftcentralno
no-recurrence-events50-59ge405-90-2no2rightright_upno


  • 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)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<ord>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events50-59ge400-40-2no1rightcentralno
no-recurrence-events50-59ge400-40-2no1leftleft_lowno
no-recurrence-events70-79ge400-40-2no1leftright_lowno
no-recurrence-events40-49premeno0-40-2no2rightright_lowno
no-recurrence-events50-59ge400-40-2no2leftcentralno
no-recurrence-events30-39premeno0-40-2no2rightcentralno
recurrence-events30-39premeno0-40-2no2rightcentralno
no-recurrence-events40-49premeno0-40-2no3leftcentralno
no-recurrence-events60-69ge405-90-2no1leftcentralno
no-recurrence-events40-49premeno5-90-2no1leftleft_lowyes


  • 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)
ABCDEFGHIJ0123456789
Class
<fctr>
age
<fctr>
menopause
<fctr>
tumor_size
<ord>
inv_nodes
<fctr>
node_caps
<fctr>
deg_malig
<int>
breast
<fctr>
breast_quad
<fctr>
irradiat
<fctr>
no-recurrence-events50-59ge4050-540-2no1rightright_upno
no-recurrence-events40-49premeno50-540-2no2leftleft_lowno
no-recurrence-events60-69ge4050-540-2no2leftleft_lowno
no-recurrence-events60-69ge4050-540-2no2rightleft_upyes
no-recurrence-events50-59premeno50-540-2yes2rightleft_upyes
recurrence-events50-59premeno50-549-11yes2rightleft_upno
recurrence-events40-49premeno50-540-2no2rightleft_lowyes
recurrence-events60-69ge4050-540-2no3rightleft_upno
recurrence-events60-69ge4045-490-2no1rightright_upyes
no-recurrence-events40-49premeno45-490-2no2leftleft_lowyes


  • 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, ])
ABCDEFGHIJ0123456789
 
 
menopause
<fctr>
tumor_size
<ord>
inv_nodes
<ord>
age
<fctr>
2premeno40-440-230-39
3premeno40-440-230-39
4premeno50-540-240-49
5premeno40-440-240-49
6premeno40-440-240-49
7premeno45-490-240-49
8premeno40-440-240-49
9premeno50-540-240-49
10premeno40-440-250-59
11premeno50-540-250-59