class: title-slide, middle, center background-image: url(data:image/png;base64,#imagenes/liigh_unam_logo.png) background-position: 10% 10% background-size: 15% .center-column[ # Manipulación de datos en R ### ā<br/>Nivel bĆ”sico ####Dra. Evelia Coss #### 2023/09/22 ] --- ## Paquetes necesarios ```r install.packages("dplyr") # Manipulación de datos install.packages("tidyr") # Manipulación de datos install.packages("tidyverse")# Manipulación de datos install.packages("reshape2") # Transformación de datos install.packages("ggplot2") # Visualización grafica install.packages("cowplot") # Generar varios graficos en una misma figura ``` --- ## Cargar paquetes ```r library(dplyr) # Manipulación de datos library(tidyr) # Manipulación de datos library(tidyverse) # Manipulación de datos library(reshape2) # Transformación de datos library(cowplot) # Visualización grafica library(ggplot2) # Generar varios graficos en una misma figura ``` --- class: center, middle
# Estructura de datos / Tipos de datos --- ## Existen 5 estructuras de datos en R Las estructuras de datos son objetos que contienen datos. Cuando trabajamos con R, lo que estamos haciendo es manipular estas estructuras. | Tipo | Declaración de la variable | Conversión | Dimensiones | Contenido | |-------------|----------------------------------|------------------|--------------|-------------------------| | Vector | c(), seq(), rep(), valorI:valorN; seq_len() | as.vector() | 1 | homogĆ©nea | | Lists | list() | as.list() | 1* | homogĆ©nea | | Matrix | matrix(valores, nrow=x, ncol=y) | as.matrix() | 2 | heterogĆ©nea | | Dataframe | data.frame() | as.dataframe() | 2 | heterogĆ©nea | Tambien estan los `array` pero son poco usados en R. Para conocer la estructura del archivo debes usar `str()`. Una lista puede contener matrices en su interior, vectores, funciones, etc. --- .center[ <img src = "imagenes/DataStructure2.png", height = "400"> ] --- ## Recordatorio: Clases de variables | Clases | Declaración de la variable | Conversión de formato | Reglas | |-----------|------------------------------|-------------------------|--------------------------------------------------------------| | numeric | `numeric()` | `as.numeric()` | FALSE -> 0, TRUE -> 1; "1", "2", ... -> 1,2, ...; "A" -> NA | | integer | `integer()` | `as.integer()` | FALSE -> 0, TRUE -> 1; "1", "2", ... -> 1,2, ...; "A" -> NA | | double | `double()` | `as.double()` | | | character | `character()` | `as.character()` | 1,2, ... -> "1", "2", ...; FALSE -> "FALSE"; TRUE -> "TRUE"| | logical | `logical()` | `as.logical()` | 0 -> FALSE, other numbers -> TRUE; ("FALSE", "F") -> FALSE; ("TRUE", "T") -> TRUE, other character -> NA| | factor | `factor()` | `as.factor()` | | Si queremos saber la clase de la variable debemos usar `class()`, aunque tambien `str()` te dice esta información. > NOTA: `as.integer()` convierte los numeros a enteros. Ejemplo: as.integer(2.5) = 2. En cambio, `as.double()` permite que los numeros contengan decimales. .left[.footnote[.black[ R for beginners, PĆ”gina 24 ]]] --- ## Recordatorio: Operadores | AritmĆ©ticos | Comparación | Argumentos lógicos (Logical Operators) | |--------------------------|---------------------------|------------------------------------------| | `+` Adición / suma | `<` Menor que | `!x` - Not x (logical NOT) | | `-` Sustracción / resta | `>` Mayor que | `x & y` OR `x AND y` - (logical AND) | | `*` Multiplicación | `<=` Menor o igual que | `x && y` - identico | | `/` OR %% División | `>=` Mayor o igual que | `xor(x,y)` Funcion OR | | `^` OR ** Exponencial | `==` Igual a | `%in%` pertenece a | | `%/%` División integral | `!=` Diferente de | | Otra forma de escrir OR es `x | y` OR `x || y`. .left[.footnote[.black[ R for beginners, PĆ”gina 25 ]]] --- ## JerarquĆa de operaciones En R, al igual que en matemĆ”ticas, las operaciones tienen un orden de evaluación definido. Cuanto tenemos varias operaciones ocurriendo al mismo tiempo, en realidad, algunas de ellas son realizadas antes que otras y el resultado de ellas dependerĆ” de este orden. | Orden | Operadores | |-------|-------------------------| | 1 | `^` | | 2 | `* /` | | 3 | `+ -` | | 4 | `< > <= >= == !=` | | 5 | `!` | | 6 | `&` | | 7 | OR | --- ## Funciones bĆ”sicas en R | Función | Empleo | Documentación | Ejemplos | |----------------|---------------------|---------------|------------| | `sum()` | Adición / suma | `?sum` | sum(2,7) | | `prod()` | Multiplicación | `?prod` | prod(9,2) | | `max()` | Valor mĆ”ximo | `?max` | max(c(1,2,3,4,5))| | `min()` | Valor mĆnimo | `?min` | min(1:5) | | `range()` | Rango | `?range` | range(c(2,8,7,6,1)) | | `mean()` | Promedio | `?mean` | mean(c(2,8,7,6,1)) | | `median()` | Mediana | `?median` | median(c(2,8,7,6,1)) | | `var()` | Varianza | `?var` | var(1:10); var(1:5, 1:5) | | `cov()` | Covarianza | `?cov` | cov(1:10, 2:11)| | `cor()` | Matriz de correlación | `?cor` | cor(1:10, 2:11)| Existen otras funciones matematicas como `log(), exp(),log10(), log2(), sin(), cos(), tan(), asin(), acos(), atan(), abs(), sqrt()`, etc. --- ## Funciones bĆ”sicas en R | Función | Empleo | Documentación | Ejemplos | |----------------|--------------------------------------------|---------------|--------------------------------| | `unique()` | Valor unico | ?unique | unique(df$expression) | | `sort()` | Ordenar | ?sort | sort(df$expression) | | `order()` | Ordenar | ?order | df[order(df$expression),] | | `table()` | cuentas de cada valor en tablas, la columna debe ser factor | ?table | table(df$expression) | | `subset()` | Extraer información de una MATRIZ o DATAFRAME | ?subset | subset(df, expression == 1.8) | | `sample()` | Extraer información de manera aleatoria | ?sample | sample(df$expression, size =3) | | `length()` | NĆŗmero de elementos de un VECTOR | ?length | length(df$expression) | | `dim()` | Dimensiones de una MATRIZ o DATAFRAME | ?dim | dim(df) | | `is.na()` | Es un valor NA? | ?is.na | is.na(df) | | `t()` | Cambiar filas por columnas (transposición) | ?t | t(df) | .left[.footnote[.black[ R for beginners, PĆ”gina 32 ]]] --- name: en-vivo background-color: var(--morado-claro) class: middle, center, inverse
# Manipulación de datos con R base --- ## Ejercicio: Vector ```r ClaseBioinfo <- c("Jose Luis", "Diego", "Rosita", "Yuri", "Ulises", "Tere", "Chucho") ClaseBioinfo str(ClaseBioinfo) # Ver estructura ClaseBioinfo =="Ulises" ClaseBioinfo =="Chucho" ``` Cuando son mas de un valor usamos `%in%` ```r ClaseBioinfo %in% c("Ulises", "Chucho") ``` --- ## Ejercicio: Dataframe ```r df <- data.frame(genes = paste0("Gen", seq_len(8)), expression = c(3.8, 5.5, 6.3, 1.8, 9, rep(3,3)), treatment =c(rep("Control", 4), rep("Condicion1",4))) ``` 1) Modifica la columna 3 perteneciente a tratamiento (treatment) a factor. ```r df$treatment <- as.factor(df$treatment) # conversion a factor ``` 2) Renombra las filas con los nombres de los genes y elimina la columna 1. ```r rownames(df) <- df$genes # renombrar df <- df[,-1] # eliminar columna 1 ``` --- class: center, middle
# Indexado en R --- ## Index .pull-left[ Por medio de un **index** podemos: - 1) Obtener la información de un dato en especĆfico. - 2) Modificar un dato en especĆfico. - 3) Eliminarlo un dato en especĆfico. Podemos hacer la pregunta de dos maneras, 1) ĀæCuĆ”l es el nivel de expresión del Gen2? O 2) ĀæQue gen contiene una expresión de 5.5? ] .center[.pull-right[ <img src = "figures/dataframe_ejemplo.png", height = "400">]] --- ## Ejercicios 1) **ĀæCuĆ”l es el nivel de expresión del Gen2?** > NOTA: Recuerda que un dataframe tiene dos dimensiones 1) fila y 2) columna, dataframe[fila, columna]. Estos nos ayudaran como coordenadas en el dataframe. ```r # Opcion A df[2,1] # [1] 5.5 # Opcion B df$expression[2] # [1] 5.5 # Opcion C df["Gen2",] # expression treatment # Gen2 5.5 Control df["Gen2",1] # [1] 5.5 # Opcion D df["Gen2","expression"] # [1] 5.5 ``` --- ## Ejercicios 2) **ĀæQue gen contiene una expresión de 1.8?** .pull-left[ ```r # Opcion A df[df[, "expression"] == 1.8,] # expression treatment # Gen4 1.8 Control df[df[, 1] == 1.8,] # expression treatment # Gen4 1.8 Control # Opcion B df[df == 1.8,] # expression treatment # Gen4 1.8 Control ``` ] .pull-left[ ```r # Opcion C df[df$expression == 1.8,] # expression treatment # Gen4 1.8 Control # Opcion D subset(df, expression == 1.8) # expression treatment # Gen4 1.8 Control ``` ] --- class: center, middle
# Marvel vs DC comics .center[.pull-right[ <img src = "logos/Marvel_Logo.png", height = "250">] ] .center[.pull-left[ <img src = "logos/DC-comic-1.png", height = "250">] ] --- ## Paqueterias importantes en la Manipulación de datos en R - Tidyverse packages - tidyr - dplyr - ggplot2 - readr - purrr - tibble - stringr - forcats Cada paquete contiene sus propias instalaciones, aunque al instalar el paquete `Tidyverse`, algunas funciones podrĆan compartirse con los demĆ”s paquetes. > **NOTA:** Cuando queremos evitar chocar entre paquetes indicamos de donde viene la funcion, ejemplo: `dplyr::select()`. Para mĆ”s información pueden visitar su [sitio web](https://www.tidyverse.org/packages/). --- ## %>% pipeline Empleando el paquete `Tidyverse` y `dplyr` puedes acceder a usar `%>%`, el cual nos permitirĆ” enlazar funciones en la modificación de un dataframe. ```r df %>% head() # expression treatment # Gen1 3.8 Control # Gen2 5.5 Control # Gen3 6.3 Control # Gen4 1.8 Control # Gen5 9.0 Condicion1 # Gen6 3.0 Condicion1 ``` --- ## Archivo tipo `Tibble` Cuando trabajamos con los paquetes provenientes de `Tidyverse` los archivos de salida por lo regular son tipo `tibble`, que es parecido a un dataframe, pero puede chocar con algunas paqueterias para manipulacion de dataframe. Por lo que regularmente convertimos esta salida a dataframe usando `as.data.frame()` Para mĆ”s información revisa el paquete [tibble](https://tibble.tidyverse.org/). --- ## Funciones que vamos a emplear de `dplyr` .content-box-gray[ - `select()` : Seleccionar nombres de las columnas. --> select(dataframe, columna1, columna2, ... columnax) - `filter()` : Filtrar filas por una condicion especifica, apartir de la columna. --> filter(dataframe, columna1 == "condicion") - `mutate()` : Modificar o agregar columnas. --> mutate(dataframe, columna1 = "condicion") - `group_by()` : Agrupar informacion de acuerdo a un(as) columna(s) seleccionada(s). - `if_else()` : Condicional. --> if_else(dataframe, codicion, si se acepta entonces, si se rechaza entonces) - `arrange()` : Acomodar los resultados, default de menor a mayor. - `count()`: Cuenta los valores de acuerdo a una variable. - `left_join()` : Unir dos dataframe con base en una misma columna en comun. --> left_join(dataframe1, dataframe2, by = "Columna en comun, mismo nombre") - `n_distinct()` : Cuenta las filas unicas. - `distinct()` : Muestra las filas duplicadas. - `summarise()` : reduce varios valores seleccionados en un resumen. ] Para mĆ”s información visita el [Github del paquete dplyr](https://github.com/cran/dplyr). Para ver todas las funciones existentes del paquete puede ver el [Cheat Sheet](https://raw.githubusercontent.com/rstudio/cheatsheets/main/pngs/thumbnails/data-transformation-cheatsheet-thumbs.png). --- ## Funciones que vamos a emplear de `reshape2` .content-box-gray[ - `melt()` : Modificación el formato de un dataframe. ] Para mĆ”s información visita el [Github del paquete reshape2](https://github.com/cran/reshape2). Aunque este paquete se encuentra descontinuado, aun funcionan las funciones. Fue absorbido posteriormente por el paquete `tidyr`. Se supone que la función `gather()` del paquete `tidyr` realiza lo mismo que `melt()` del paquete `reshape2`. Para mĆ”s información visita el [Github del paquete tidyr](https://tidyr.tidyverse.org/). --- ## Nombres de las filas y columnas en un dataframe Para conocer el nombre de las **filas** se usa la función `rownames()`. ```r rownames(infoCharacters) ``` En este dataframe los nombres de las filas son numĆ©ricas empezando de 1 hasta 734. Para conocer el nombre de las **columnas** se usa la función `colnames()`. ```r colnames(infoCharacters) ``` > **Ejercicio:** Obten el nombre las columnas de los demas dataframe (infoPowers e infoStats). --- .center[ <img src = "figures/dplyr_joins.png", height = "400">] --- class: center, middle
# Manipulación de datos ## Emplear el archivo `Clase4_VieRnesBioinfo_EveliaCoss.R` Pasos 1 a 6 --- class: center, middle
# Ejercicios de Manipulación de datos ## Trabajo en equipo 20 min para terminar todos los ejercicios por equipo --- ## Ejercicios 1) ¿CuÔntos individuos tenemos de cada género (Gender), considerando su raza (Race) y empresa (Publisher)? 2) ¿CuÔntos personajes villanos, neutrales y héroes (su bando, Aligment) por cada empresa? 3) ¿CuÔntos individuos tenemos de cada género (Gender), considerando su bando (Aligment) y empresa (Publisher)? --- class: center, middle
# Manipulación de datos ## Emplear el archivo `Clase4_VieRnesBioinfo_EveliaCoss.R` Pasos 7 a 10 --- class: center, middle
# Ejercicios de Manipulación de datos ## Trabajo en equipo 20 min para terminar todos los ejercicios por equipo --- ## Ejercicios 1) ¿Quiénes son los personajes mÔs fuertes de cada empresa? 2) ¿Quiénes son los personajes mÔs inteligentes de cada empresa? 3) ¿Quiénes son las mujeres mÔs poderosas y malvadas? 4) ¿Quiénes son los hombres mÔs poderosos y malvados? --- ## Deben practicar mucho cuando aprenden un lenguaje ### Cursos - Cursos de [Software Carpentry](https://software-carpentry.org/lessons/) .center[ <img src = "figures/Cursos_softwareCarpentry.png", height = "400"> ] --- ## Referencias - [Tidyverse: dplyr y tidyr](http://gauss.inf.um.es:8080/tabular-tidyverse/) - [Mutating joins](https://dplyr.tidyverse.org/reference/mutate-joins.html) --- ## Antes de terminar: ```r save.image(paste0(indir, miAmbiente1.RData)) ``` .scroll-box-14[ ```r sessionInfo() # R version 4.3.1 (2023-06-16 ucrt) # Platform: x86_64-w64-mingw32/x64 (64-bit) # Running under: Windows 11 x64 (build 22621) # # Matrix products: default # # # locale: # [1] LC_COLLATE=English_United States.utf8 # [2] LC_CTYPE=English_United States.utf8 # [3] LC_MONETARY=English_United States.utf8 # [4] LC_NUMERIC=C # [5] LC_TIME=English_United States.utf8 # # time zone: America/Mexico_City # tzcode source: internal # # attached base packages: # [1] stats graphics grDevices utils datasets methods base # # other attached packages: # [1] cowplot_1.1.1 reshape2_1.4.4 xaringanthemer_0.4.2 # [4] emo_0.0.0.9000 fontawesome_0.5.2 icons_0.2.0 # [7] xaringanExtra_0.7.0 lubridate_1.9.3 forcats_1.0.0 # [10] stringr_1.5.0 dplyr_1.1.2 purrr_1.0.2 # [13] readr_2.1.4 tidyr_1.3.0 tibble_3.2.1 # [16] ggplot2_3.4.3 tidyverse_2.0.0 knitr_1.44 # # loaded via a namespace (and not attached): # [1] rappdirs_0.3.3 sass_0.4.7 utf8_1.2.3 generics_0.1.3 # [5] stringi_1.7.12 hms_1.1.3 digest_0.6.33 magrittr_2.0.3 # [9] evaluate_0.22 grid_4.3.1 timechange_0.2.0 fastmap_1.1.1 # [13] plyr_1.8.9 jsonlite_1.8.7 fansi_1.0.4 scales_1.2.1 # [17] jquerylib_0.1.4 cli_3.6.1 rlang_1.1.1 crayon_1.5.2 # [21] munsell_0.5.0 withr_2.5.1 cachem_1.0.8 yaml_2.3.7 # [25] tools_4.3.1 uuid_1.1-1 tzdb_0.4.0 colorspace_2.1-0 # [29] assertthat_0.2.1 vctrs_0.6.3 R6_2.5.1 lifecycle_1.0.3 # [33] pkgconfig_2.0.3 pillar_1.9.0 bslib_0.5.1 gtable_0.3.4 # [37] Rcpp_1.0.11 glue_1.6.2 xfun_0.40 tidyselect_1.2.0 # [41] rstudioapi_0.15.0 htmltools_0.5.6 rmarkdown_2.25 xaringan_0.28 # [45] compiler_4.3.1 ``` ] --- class: center, middle
# Siguiente VieRnes 20 de octubre 2023 ## El ABC de las funciones y loops en R Gracias por tu atención, respira y coméntame tus dudas.