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]
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-events | 30-39 | premeno | 30-34 | 0-2 | no | 3 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 20-24 | 0-2 | no | 2 | right | right_up | no |
no-recurrence-events | 40-49 | premeno | 20-24 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 60-69 | ge40 | 15-19 | 0-2 | no | 2 | right | left_up | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 2 | right | right_low | no |
no-recurrence-events | 60-69 | ge40 | 15-19 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 50-59 | premeno | 25-29 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 60-69 | ge40 | 20-24 | 0-2 | no | 1 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 50-54 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 20-24 | 0-2 | no | 2 | right | left_up | no |
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.
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-events | 40-49 | premeno | 20-24 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 50-54 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 3 | left | central | no |
no-recurrence-events | 40-49 | premeno | 30-34 | 0-2 | no | 3 | left | left_up | no |
no-recurrence-events | 40-49 | premeno | 15-19 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 25-29 | 0-2 | no | 2 | left | left_up | no |
no-recurrence-events | 40-49 | premeno | 10-14 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 30-34 | 0-2 | no | 1 | left | left_low | no |
no-recurrence-events | 40-49 | premeno | 10-14 | 0-2 | no | 2 | left | left_up | no |
no-recurrence-events | 40-49 | premeno | 20-24 | 0-2 | no | 2 | left | central | no |
- Reordenar el dataset según el tamaño del tumor.
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-events | 40-49 | premeno | 0-4 | 0-2 | no | 2 | right | right_low | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 3 | left | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 2 | left | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | right | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | left | left_low | no |
no-recurrence-events | 70-79 | ge40 | 0-4 | 0-2 | no | 1 | left | right_low | no |
no-recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
no-recurrence-events | 60-69 | lt40 | 10-14 | 0-2 | no | 1 | left | right_up | no |
no-recurrence-events | 50-59 | premeno | 10-14 | 0-2 | no | 3 | left | left_low | no |
¡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"
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-events | 40-49 | premeno | 0-4 | 0-2 | no | 2 | right | right_low | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 3 | left | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 2 | left | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | right | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | left | left_low | no |
no-recurrence-events | 70-79 | ge40 | 0-4 | 0-2 | no | 1 | left | right_low | no |
no-recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
no-recurrence-events | 60-69 | ge40 | 5-9 | 0-2 | no | 1 | left | central | no |
no-recurrence-events | 50-59 | ge40 | 5-9 | 0-2 | no | 2 | right | right_up | no |
- Reordenar el dataset según el tamaño del tumor y el grado de que tiene el tumor.
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-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | right | central | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 1 | left | left_low | no |
no-recurrence-events | 70-79 | ge40 | 0-4 | 0-2 | no | 1 | left | right_low | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 2 | right | right_low | no |
no-recurrence-events | 50-59 | ge40 | 0-4 | 0-2 | no | 2 | left | central | no |
no-recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
recurrence-events | 30-39 | premeno | 0-4 | 0-2 | no | 2 | right | central | no |
no-recurrence-events | 40-49 | premeno | 0-4 | 0-2 | no | 3 | left | central | no |
no-recurrence-events | 60-69 | ge40 | 5-9 | 0-2 | no | 1 | left | central | no |
no-recurrence-events | 40-49 | premeno | 5-9 | 0-2 | no | 1 | left | left_low | yes |
- Reordenar el dataset según el tamaño del tumor (pero descendiente) y el grado de maligno que tiene el tumor.
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-events | 50-59 | ge40 | 50-54 | 0-2 | no | 1 | right | right_up | no |
no-recurrence-events | 40-49 | premeno | 50-54 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 60-69 | ge40 | 50-54 | 0-2 | no | 2 | left | left_low | no |
no-recurrence-events | 60-69 | ge40 | 50-54 | 0-2 | no | 2 | right | left_up | yes |
no-recurrence-events | 50-59 | premeno | 50-54 | 0-2 | yes | 2 | right | left_up | yes |
recurrence-events | 50-59 | premeno | 50-54 | 9-11 | yes | 2 | right | left_up | no |
recurrence-events | 40-49 | premeno | 50-54 | 0-2 | no | 2 | right | left_low | yes |
recurrence-events | 60-69 | ge40 | 50-54 | 0-2 | no | 3 | right | left_up | no |
recurrence-events | 60-69 | ge40 | 45-49 | 0-2 | no | 1 | right | right_up | yes |
no-recurrence-events | 40-49 | premeno | 45-49 | 0-2 | no | 2 | left | left_low | yes |
- 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, ])
menopause <fctr> | tumor_size <ord> | inv_nodes <ord> | age <fctr> | |
---|---|---|---|---|
2 | premeno | 40-44 | 0-2 | 30-39 |
3 | premeno | 40-44 | 0-2 | 30-39 |
4 | premeno | 50-54 | 0-2 | 40-49 |
5 | premeno | 40-44 | 0-2 | 40-49 |
6 | premeno | 40-44 | 0-2 | 40-49 |
7 | premeno | 45-49 | 0-2 | 40-49 |
8 | premeno | 40-44 | 0-2 | 40-49 |
9 | premeno | 50-54 | 0-2 | 40-49 |
10 | premeno | 40-44 | 0-2 | 50-59 |
11 | premeno | 50-54 | 0-2 | 50-59 |