class: title-slide, middle, center background-image: url(data:image/png;base64,#figures/liigh_unam_logo.png) background-position: 10% 50% background-size: 15% .center-column[ # Introducción a R ### VieRnes de Bioinformatica ####Sofía Salazar #### 2023/09/29 ] --- ## .center[Sobre mí] .left-col[ ###
Sofía Salazar Magaña Estudiante de la [Licenciatura en Ciencias Genómicas](https://www.enesjuriquilla.unam.mx/?page_id=2136) @ ENES-J UNAM Asistente de investigación @ [RegGenoLab](https://liigh.unam.mx/), LIIGH UNAM Asistente de investigación @ [Im Lab](https://hakyimlab.org/), The University of Chicago [
GitHub: SophSM](https://github.com/SophSM) ] .center-col[ ###
Miembro - [LupusRGMX](https://twitter.com/LupusRgmx) - [Proyecto JAGUAR](https://twitter.com/PJaguarLATAM) ] .right-col[ <img src="figures/LAB-logo.png", height = "150"> <img src = "figures/lupus-logo.png"> <img src = "figures/jaguar-logo.png"> ] --- class: center, middle
# Dia 2. Introducción a R --- ## ¿Qué es R? R es un entorno de desarrollo de software libre y lenguaje de programación. **¿Por qué utilizar R?** Es ampliamente utilizado para la computación estadística, gráfica, y de machine learning. Ofrece una amplia variedad de **funciones estadísticas** (modelos lineales y no lineales, pruebas estadísticas clásicas, análisis de series de tiempo, clasificación, agrupamiento, etc.), y para realizar gráficas. Además, existen numerosas librerías que nos pemiten realizar análisis y más gráficas, incluyendo para análisis de datos genómicos. .center[ <img src = "figures/r-logo.png", height = "150"> ] --- .center[ <img src = "figures/meme1.jpeg", height = "600"> ] --- .center[ <img src = "figures/meme2.jpeg", height = "600"> ] --- ## ¿Cómo instalamos R? Para installar R, debemos de entrar a la página de [CRAN](https://cran.r-project.org/) "The Comprehensive R Archive Network". Al installar R, descargamos también ~ 25 paqueterías/librerías. **CRAN** es una red en la que se archivan todas las versiones de R base, así como todos los paquetes para R que han pasado por un proceso de revisión riguroso, realizado por el CRAN Team. .center[ <img src = "figures/download-r.png", height = "320"> ] --- ## ¿Qué es RStudio? RStudio es un **entorno de desarrollo integrado (IDE)** para R. Un IDE es una aplicación que ayuda a los programadores a desarrollar código de una manera eficiente. Nos proporciona una interfaz para poder editar código fuente, herramientas de ambiente, visualización, terminal y consola. **RStudio Desktop** es una aplicación que se utiliza ampliamente para desarrollar programas en R, pero también podemos accesar al IDE de RStudio a través con [RStudio Server](https://posit.co/download/rstudio-server/), a través de un navegador web. .center[ <img src = "figures/rstudio-logo.png", height = "250"> ] --- ## ¿Cómo descargamos RStudio? Podemos descargar RStudio desde [esta página](https://posit.co/download/rstudio-desktop/). Ya realizamos el paso 1: Install R. En el paso 2: Install R studio, nos debería detectar el sistema operativo, descarguemos la versión recomendada en el botón **azul** y sigamos las instrucciones de instalación. .center[ <img src = "figures/download-rstudio.png", height = "400"> ] --- ## Las partes de RStudio .center[ <img src = "figures/partes-rstudio.png", height = "600"> ] --- ## Cambiando el aspecto de RStudio Podemos cambiar la forma en que se ve la aplicación desde **Editar > Preferencias > Apariencia**, escogemos el tema que nos guste y damos click en **Aplicar** y luego **OK** .center[ <img src = "figures/apariencia-rstudio.png", height = "400"> ] --- ## Comenzando con R y RStudio: 1. R Project Al comenzar a trabajar con R y RStudio, ya sea para crear un programa para un proyecto, crear una aplicación, presentación, blog, paquete, etc, es recomendado crear un **R project**. Al crear un R project, se creará un folder en donde estarán todos los documentos, fotos, scripts, etc. que usaremos en ese projecto. Es una forma organizada y práctica de trabajar con R. --- ## ¿Cómo iniciamos un R project? Vayamos en la parte superior al menú **Archivos > Nuevo Proyecto**. .center[ <img src = "figures/r_2.png", height = "450">] --- ## ¿Cómo iniciamos un R project? Seleccionamos la opción de **Nuevo directorio**. .center[ <img src = "figures/r_3.png", height = "450">] --- ## ¿Cómo iniciamos un R project? Seleccionamos el tipo de projecto que vamos a iniciar, en nuestro caso **Nuevo proyecto**. .center[ <img src = "figures/r_4.png", height = "450">] --- ## ¿Cómo iniciamos un R project? Nombramos el folder que crearemos y seleccionamos en dónde queremos que se almacene. .center[ <img src = "figures/r_5.png", height = "450">] --- ## ¿Cómo iniciamos un R project? ¡Felicidades, acabas de crear un R project! Si vamos al folder en donde creamos nuestro proyecto, podemos observar que se creó un archivo con terminación **Rproj**, este es un archivo que contiene la configuración específica para nuestro proyecto. Este archivo también establece como directorio de trabajo el folder en donde iniciamos el proyecto (puedes comprobarlo desde la consola de RStudio, escribiendo el comando `getwd()`). Esto es muy conveniente puesto que así podemos asegurarnos de que vamos a acceder a los archivos que estén exclusivamente en nuestro entorno de trabajo. ```r getwd() # [1] "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep" ``` Cambiar directorio de trabajo ```r setwd("/Users/sofiasalazar/nuevodirectorio") ``` --- ## Comenzando con nuestro proyecto: Crear un Rscript Para comenzar a trabajar en un proyecto, necesitamos crear un archivo para escribir nuestro programa. Entra en **Archivo > Nuevo Archivo**. Podemos ver que tenemos distintas opciones de archivos que podemos crear, en este caso vamos a crear nuestro primer Rscript. .center[ <img src = "figures/r_6.png", height = "350">] --- ## Crear un Rscript **¿Qué es un Rscript?** Es simplemente un archivo de texto con las instrucciones de nuestro algoritmo escritas en el lenguaje de R. También contiene nuestros comentarios escritos con `#`. Intenta escribir tu primer Rscript en el **editor**, copiando el siguiente algoritmo para realizar una suma: ```r a <- 2 b <- 3 suma = a + b suma ``` Selecciona todo el código, después ve a la parte superior de la ventana del **editor** y da click en el botón **Run**. Enseguida de esto, en la **consola** se ejecutará tu código y podrás ver el siguiente resultado: .left-col[ <img src = "figures/script-R.png", height = "150">] .center-col[ También pueden ejecutar tu código línea por línea, poniendo tu cursor al principio o al final de la linea y presionando las teclas **Control + Enter** o **Command + Enter**. ] --- ## Crear un Rscript **¿Qué es un Rscript?** Es simplemente un archivo de texto con las instrucciones de nuestro algoritmo escritas en el lenguaje de R. También contiene nuestros comentarios escritos con `#`. Intenta escribir tu primer Rscript en el **editor**, copiando el siguiente algoritmo para realizar una suma: ```r a <- 2 b <- 3 suma = a + b suma ``` Selecciona todo el código, después ve a la parte superior de la ventana del **editor** y da click en el botón **Run**. Enseguida de esto, en la **consola** se ejecutará tu código y podrás ver el siguiente resultado: .left-col[ <img src = "figures/script-R.png", height = "150">] .center-col[ También pueden ejecutar tu código línea por línea, poniendo tu cursor al principio o al final de la linea y presionando las teclas **Control + Enter** o **Command + Enter**. ] .right-col[<img src = "figures/meme4.jpeg", height = "200">] --- ## R session Al momento de comenzar a ejecutar líneas de código, guardar valores en variables y cargar librerías, estaremos guardando esto en nuestra "sesión de R". Esto es un "ambiente" que puedes guardar al finalizar de trabajar y lo que guardaste lo puedes cargar a Rstudio la próxima vez que vayas a continuar trabajando. Para guardar tu sesión de R: ```r save.image(file = "/una/direccion/enTu/PC/sesionR_miPrograma.RData") ``` Para cargar tu sesión de R: ```r load(file = "/una/direccion/enTu/PC/sesionR_miPrograma.RData") ``` También puedes guardar y cargar solo alguna variable: ```r save(variable, file = "/una/direccion/enTu/PC/variable.RData") load("/una/direccion/enTu/PC/variable.RData") # ahora "variable" estara en tu ambiente ``` --- ## Buenas prácticas de programación: Set up de tu trabajo Es buena idea comenzar **todos** tus scripts con las mismas líneas de código que indiquen lo siguiente: - Título de tu programa - Autor - Fecha - Propósito general de tu programa - Directorio de input: aquí estan guardados los datos que vas a usar en el programa - Directorio de output: aquí es donde vas a guardar tus resultados - Librerías que utilizarás en el programa - Líneas en donde cargues los datos que vas a usar .center[ <img src = "figures/meme3.jpeg", height = "280">] --- ## Buenas prácticas de programación: Set up de tu trabajo ```r # Mi programa # Tu nombre # Fecha: dd-mm-aaaa # Este script ejecuta xxx utilizando como input xxx y dando como output xxx # Input dir indir <- "/Users/sofiasalazar/miPrograma/input/" # Output dir outdir <- "/Users/sofiasalazar/miPrograma/output/" # Librerias library(ggplot2) library(tidyverse) # Cargar input datos_file <- paste0(indir,"misDatos.csv") datos_file # [1] "/Users/sofiasalazar/miPrograma/input/misDatos.csv" ``` ```r datos <- read.csv(datos_file) load(file = paste0(indir, "variable.RData")) load(file = paste0(indir, "sesionR_miPrograma.RData")) ``` --- ## ¿Qué es una librería? En programación, una librería es una colección de código pre-escrito. Una librería contiene una "paquete" o "librería" de funciones que podemos utilizar si descargamos e importamos esa librería a nuestro programa. Como mencioné anteriormente, al descargar R, también descargamos una serie de librerías, llamadas **base R packages**. Sin embargo, dependiendo del problema que queramos resolver con nuestro programa, necesitaremos librerías que nos permitan hacer otras cosas. Existen distintas formas de instalar librerías. --- ## Instalar librerías: CRAN 1. Instalación desde el repositorio de CRAN: podemos descargar paqueterías de CRAN de dos formas: La primera, desde consola con el siguiente comando: ```r install.packages("ggplot2") ``` La segunda, desde el menú **Herramientas > Instalar paqueterías**. En la ventana, ingresamos el nombre de la librería y click en **Instalar**. .center[ <img src = "figures/r_7.png", height = "250">] --- ## Instalar librerías: Bioconductor Alternativamente, podemos instalar paqueterías de Bioconductor, que es otro repositorio de paquetes diseñados para el análisis de datos genómicos, por ejemplo para hacer análisis estadísticos, anotación, acceso a bases de datos públicas, etc. Hay muchas librerías que están tanto en CRAN como en Bioconductor, pero también hay librerías específicas para uno de ellos. Para poder instalar desde bioconductor, necesitamos primero instalar el "instalador de bioconductor": ```r install.packages("BiocManager") # Esto es necesario solo 1 vez ``` Después, instalamos la librería que queremos y la cargamos: ```r BiocManager::install("DESeq2") library(DESeq2) ``` Puedes ver librerías y sus manuales en la [página de Bioconductor](bioconductor.org) o cuando ingresamos en **consola**: ```r browseVignettes("DESeq2") ``` --- ## Instalar librerías: Source Podemos instalar librerías si tienes los archivos en tu PC, esto es útil cuando no tienes acceso a internet. ```r install.packages("~/Downloads/ggplot2_1.0.1.tar.gz", type="source", repos=NULL) ``` O desde GitHub: ```r remotes::install_github("mitchelloharawild/icons") ``` --- ## Buenas prácticas al finalizar tu programa - **Guarda tu output** ```r write.csv(datos_procesados, file = paste0(outdir, "datos_procesados.csv")) save(datos_procesados, file = paste0(outdir, "datos_procesados.RData")) save.image(file = paste0(outdir, "sesionR_miPrograma.RData") ``` - **Especifica qué librerías utilizaste y qué versiones** Cuando hacemos un programa, puede que en el futuro otras personas lo quieran utilizar, sin embargo, es probable que **las librerías que usaste en el momento que escribiste el programa se hayan actualizado.** Es por eso que **al final de TODO programa que escribas, ejecutes y escribas el resultado de correr la siguiente línea.** ```r sessionInfo() ``` Puedes intentar correr este comando tú, lo que verás impreso en consola son todas las librerías instaladas en tu sesión de R, así como **la versión**. Entonces así, si alguien quiere reproducir tus resultados en algún momento, deberá instalar las mismas versiones de las librerías que tú utilizaste. --- ## Leer datos en R Existen distintos tipos de formatos de datos que podemos ingresar a R para su análisis. Los principales son: #### Datos separados por un valor Por ejemplo por comas (.csv), tab (.tsv) o espacios. Aunque la siguiente función puede leer por cualquier separador. ```r read.table("/path/dataset.csv", header = TRUE, delim = ",") read.table("/path/dataset.tsv", header = TRUE, delim = "\t") read.table("/path/dataset.", header = TRUE, delim = ",") ``` El parámetro header nos dice si considerar la primera fila como nombre de las variables. También podemos leer un archivo .csv directamente: ```r read.csv("/path/dataset.csv") ``` --- #### Archivos tipo RData Usualmente cargan todo el ambiente o varias variables ```r load("/path/ambiente.RData") ``` #### Archivos tipo RDS Se usan para cargar variables, usualmente muy pesadas ```r variable <- readRDS("/path/variable.RData") ``` --- class: center, middle
# Dia 3. Introducción a R (continuación) --- ## Abre tu R project desde la carpeta en tu computadora, abriendo el archivo `.Rproj` --- ## Recapitulando lo último que hicimos la clase pasada: ```r ###### # Script de clase "Intro a R" # Sofia Salazar # 3 de octubre 2023 ####### indir = "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep/" outdir = "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep/" ``` #### Ejercicio: cargar un dataset Ve a este [link](https://drive.google.com/file/d/1nBfZpmQNRxGMg_JeAsSKqaOPBFQur_V5/view?usp=drive_link) y descarga el archivo `planets.csv`. Asegúrate de guardarlo en el directorio donde hiciste tu Rproject. ```r getwd() # [1] "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep" ``` Carga tu archivo .csv en una variable llamada `planets` --- ```r ###### # Script de clase "Intro a R" # Sofia Salazar # 3 de octubre 2023 ####### indir = "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep/" outdir = "/Users/sofiasalazar/Desktop/LAB/ViernesBioinfo/Clase2_introR_29sep/" planets <- read.csv(paste0(indir,"planets.csv")) ``` ```r head(planets, 1) # name rotation_period orbital_period diameter climate gravity # 1 Alderaan 24 364 12500 temperate 1 standard # terrain surface_water population created # 1 grasslands, mountains 40 2e+09 2014-12-10T11:35:48.479000Z # edited url # 1 2014-12-20T20:58:18.420000Z http://swapi.co/api/planets/2/ # desc # 1 Alderaan is a fictional planet featured in the Star Wars space opera franchise. It is blue-green in appearance and is depicted as a terrestrial planet with humanoid inhabitants. It is the home of Princess Leia, one of the lead characters in the film series. In the original 1977 film, Star Wars, Alderaan is blown up by the Death Star, a giant space station capable of destroying entire planets.[2] ``` --- ## Ejercicio: 1. Guarda tu ambiente (si no lo habías guardado la clase pasada) Con el comando: ```r save.image(paste0(indir, miAmbiente1.RData)) ``` **Pregunta: Por qué lo guardé en `indir`? ** --- 2. Para simular que empezamos a trabajar otro día desde el checkpoint que creamos, guarda tu script, cierra Rstudio y vuelvelo a abrir desde el `.Rproj` file. 3. Carga tu ambiente desde el checkpoint. ```r load(paste0(indir, miAmbiente1.RData)) ``` Observa como se cargan las variables `indir`, `outdir` y `planets` sin que tengas que hacer nada. **Esta es la utilidad de hacer un "checkpoint".** --- ## Tipos de datos en R - `numeric`: guardamos números reales, enteros o decimales ```r num <- 6 decimal <- 3.4 ``` ```r class(num) # [1] "numeric" class(decimal) # [1] "numeric" ``` Para convertir un dato a tipo `numeric` utilizamos `as.numeric()` ```r numero <- "1" numero <- as.numeric(numero) class(numero) # [1] "numeric" ``` --- - `character`: guardamos texto ```r texto <- "hola" texto2 <- 'mundo' class(texto) # [1] "character" class(texto2) # [1] "character" ``` Para convertir un dato a tipo `character` utilizamos `as.character` ```r ch <- 2305 ch <- as.character(ch) class(ch) # [1] "character" ``` --- - `logical`: representan valores binarios `TRUE` o `FALSE` ```r val <- 4 < 5 val # [1] TRUE class(val) # [1] "logical" ``` Podemos tener una serie de "frases" que al final nos indiquen un valor lógico. ```r library(purrr) arreglo1 <- c() vacio <- is_empty(arreglo1) vacio # [1] TRUE ``` ```r (8 <= 10) & (9 != 9) # [1] FALSE ``` ```r (8 > 3) | (9 < 1) # [1] TRUE ``` --- Podemos convertir valores "binarios" a lógicos ```r as.logical(0) # [1] FALSE ``` ```r as.logical(1) # [1] TRUE ``` Conoce más hacerca de la función `as.logical()` con ```r ?as.logical ``` --- - `integer`: Podemos definir enteros explícitamente ```r count <- 42L class(count) # [1] "integer" ``` Convertir a entero ```r entero <- as.integer(3) class(entero) # [1] "integer" ``` Para números decimales, trunca el número hacia el cero (lo redondea hacia abajo) ```r entero <- as.integer(2.9) entero # [1] 2 ``` Si la conversión falla, nos dará un "NA" ```r entero <- as.integer("hola") entero # [1] NA ``` --- - `complex`: Podemos representar números complejos con números reales e imaginarios ```r z <- 2 + 3i class(z) # [1] "complex" ``` Podemos convertir numeros normales a complejos ```r as.complex(5) # [1] 5+0i ``` Más información: ```r ?as.complex ``` --- - `factor`: Los factores representan datos categóricos, podemos crearlos con la función `factor()`. ```r size <- factor(c("small", "large", "medium", "small")) class(size) # [1] "factor" ``` En ocasiones, queremos ver cuántas categorías de un factor existen, podemos saberlo con la función `levels()`. ```r levels(size) # [1] "large" "medium" "small" ``` Algunas funciones estadísticas requieren que una variable sea de tipo `factor`, podemos convertir cualquier variable en factor con la función `as.factor()` ```r group <- c(1, 2, 3, 2, 2, 4, 2, 3) class(group) # [1] "numeric" ``` ```r group <- as.factor(group) class(group) # [1] "factor" levels(group) # [1] "1" "2" "3" "4" ``` --- - `vector`: son arreglos de una dimensión, pueden guardar elementos del mismo tipo de datos. Algunos tipos comúnes de vectores son numéricos o lógicos. Determinamos los valores de un vector con `c()` "concatenar" ```r grades <- c(88, 45, 75, 90, 100) # numeric vector testimonies <- c(TRUE, FALSE, TRUE, TRUE, FALSE) # logical vector ``` Podemos accesar a un elemento de un vector con el índice del elemento (el lugar en donde está), empezando desde el 1 ```r grades[2] # [1] 45 ``` Accesar a un múltiples elementos por sus posiciones: utilizamos un vector de índices que nos interesan dentro de `[]` ```r my_vector <- c(10, 20, 30, 40) my_vector[c(1,3,4)] # [1] 10 30 40 ``` --- Accesar a un vector con condiciones lógicas: ```r my_vector <- c(10, 20, 30, 40, 50, 60) my_vector[my_vector>24] # [1] 30 40 50 60 ``` **Ejercicio: accesa a la calificación 90 con el índice** ```r grades <- c(88, 45, 75, 90, 100) ``` --- Accesar a un vector con condiciones lógicas: ```r my_vector <- c(10, 20, 30, 40, 50, 60) my_vector[my_vector>24] # [1] 30 40 50 60 ``` **Ejercicio: accesa a la calificación 90 con el índice** ```r grades[4] # [1] 90 ``` --- - `matrix`: las matrices son datos de dos dimensiones, con filas y colunas. Todos los elementos deben de ser del mismo tipo de dato. ```r matrix_a <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3) matrix_a # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 ``` Para accesar a un elemento de una matrix, debemos especificar primero la fila y luego la columna. Supongamos que queremos accesar al elemento "2", que está en la fila 2, columna 1 ```r matrix_a[2,1] # [1] 2 ``` Podemos también accesar a una fila o una columna entera con la siguiente notación: ```r matrix_a[1,] # accesamos a la fila 1 # [1] 1 3 5 ``` ```r matrix_a[,3] # accesamos a la columna 3 # [1] 5 6 ``` --- **Ejercicio: accesa a la columna 1 y 3 de la matriz** --- **Ejercicio: accesa a la columna 1 y 3 de la matriz** ```r matrix_a[,c(1,3)] # [,1] [,2] # [1,] 1 5 # [2,] 2 6 ``` Accesamos a una matrix con condiciones lógicas: ```r matrix_a[matrix_a > 2] # [1] 3 4 5 6 ``` --- - `list`: son tipos de datos versátiles que pueden guardar distintos tipos de datos, incluyendo vectores, matrices u otras listas. ```r person <- list(name = "Alice", age = 30, scores = c(85, 92, 78)) person # $name # [1] "Alice" # # $age # [1] 30 # # $scores # [1] 85 92 78 ``` Podemos accesar a los elementos de una lista con el signo `$` ```r person$age # [1] 30 ``` En ocasiones, podemos tener una gran cantidad de elementos en una lista, podemos ver cuáles son con `names()`. ```r names(person) # [1] "name" "age" "scores" ``` --- ### Lista de listas Crearemos una lista de listas ```r list_of_lists <- list( list(name = "Alice", age = 25, scores = c(85, 92, 78)), list(name = "Bob", age = 30, scores = c(90, 88, 76)), list(name = "Charlie", age = 22, scores = c(78, 85, 92)) ) ``` Para accesar a una de las listas: ```r first_person <- list_of_lists[[1]] cat("Nombre:", first_person$name, "\n") # Nombre: Alice cat("Edad:", first_person$age, "\n") # Edad: 25 cat("Scores:", first_person$scores, "\n") # Scores: 85 92 78 ``` **Ejercicio: Accesar al primer elemento de `scores` en el segundo individuo** --- **Ejercicio: Accesar al primer elemento de `scores` en el segundo individuo** ```r first_score <- list_of_lists[[2]]$scores[1] cat("Primer score del individuo 1:", first_score, "\n") # Primer score del individuo 1: 90 ``` --- --- `array`: los datos de este tipo extienden la concepción de matrices y vectores a más dimensiones ```r arr <- array(1:24, dim = c(2,3,4)) arr # , , 1 # # [,1] [,2] [,3] # [1,] 1 3 5 # [2,] 2 4 6 # # , , 2 # # [,1] [,2] [,3] # [1,] 7 9 11 # [2,] 8 10 12 # # , , 3 # # [,1] [,2] [,3] # [1,] 13 15 17 # [2,] 14 16 18 # # , , 4 # # [,1] [,2] [,3] # [1,] 19 21 23 # [2,] 20 22 24 ``` --- ## Dataframes - `data.frame`: Los data frames son similares a las matrices, tienen 2 dimensiones, pero podemos almacenar distintos tipos de datos ```r df <- data.frame(name = c("John", "Alice", "Bob"), age = c(25, 30, 28)) df # name age # 1 John 25 # 2 Alice 30 # 3 Bob 28 ``` `planets` es un dataframe!! ```r class(planets) # [1] "data.frame" ``` --- Para conocer las dimensiones de un dataframe: ```r dim(planets) # [1] 61 13 ``` --- Podemos accesar a las columnas de los data frames de la misma manera que con las listas, con `$` ```r df$name # [1] "John" "Alice" "Bob" ``` O también con notación de matrices ```r df[, "name"] # [1] "John" "Alice" "Bob" ``` Y podemos conocer cuáles son las columnas con `colnames()` o con `names()` ```r colnames(df) # [1] "name" "age" ``` **Ejercicio: Ingresa a la columna "orbital_period" del dataset `planets`** **Ejercicio: Determina el tipo de dato de la columna** --- **Ejercicio: Ingresa a la columna "orbital_period" del dataset `planets`** ```r planets$orbital_period # [1] 364 4818 549 341 5110 402 312 368 463 256 351 412 381 590 167 # [16] 231 278 392 NA 360 329 305 413 378 680 334 0 371 326 398 # [31] 368 263 184 201 491 305 NA 391 NA 1770 383 386 206 413 NA # [46] 481 NA 409 318 NA NA NA NA NA 384 412 NA 378 NA 304 # [61] NA ``` **Ejercicio: Determina el tipo de dato de la columna** ```r class(planets$orbital_period) # [1] "integer" ``` --- ### ¿Cómo acceder a un elemento específico de un dataframe? Si conoces la fila y columna, puedes hacerlo con notación de matrices. ```r planets[4, 4] # Diametro de Dagobah # [1] 8900 ``` Si no conoces la columna, pero sabes que debe de ser la fila de un valor de otra columna (por ejemplo, nombre del planeta), utilizamos: Notación de vectores: ```r planets[planets$name =="Dagobah",]$diameter # [1] 8900 ``` **Ejercicio: También puedes usar la función `subset()`** ```r ?subset ``` --- ```r subset(planets, name == "Dagobah", select = diameter) # diameter # 4 8900 ``` Puedes sacar el valor numérico convirtiéndolo a numeric con `as.numeric` ```r as.numeric(subset(planets, name == "Dagobah", select = diameter)) # [1] 8900 ``` O, escrito de otra manera: ```r subset(planets, name == "Dagobah")$diameter # [1] 8900 ``` **Ejercicio: utiliza subset para determinar el diameter, orbital_period y climate de Hoth** --- ```r subset(planets, name == "Hoth", select = c(diameter, orbital_period, climate)) # diameter orbital_period climate # 3 7200 549 frozen ``` Podemos accesar a filas con una condición de una columna: ```r planets[(planets$surface_water > 50), ] # name rotation_period orbital_period diameter climate # 3 Hoth 23 549 7200 frozen # NA <NA> NA NA NA <NA> # 9 Kamino 27 463 19720 temperate # 13 Kashyyyk 26 381 12765 tropical # NA.1 <NA> NA NA NA <NA> # NA.2 <NA> NA NA NA <NA> # NA.3 <NA> NA NA NA <NA> # NA.4 <NA> NA NA NA <NA> # NA.5 <NA> NA NA NA <NA> # NA.6 <NA> NA NA NA <NA> # 21 Corellia 25 329 11000 temperate # 22 Rodia 29 305 7549 hot # NA.7 <NA> NA NA NA <NA> # NA.8 <NA> NA NA NA <NA> # 25 Bestine IV 26 680 6400 temperate # NA.9 <NA> NA NA NA <NA> # NA.10 <NA> NA NA NA <NA> # NA.11 <NA> NA NA NA <NA> # 30 Mon Cala 21 398 11030 temperate # NA.12 <NA> NA NA NA <NA> # NA.13 <NA> NA NA NA <NA> # NA.14 <NA> NA NA NA <NA> # NA.15 <NA> NA NA NA <NA> # NA.16 <NA> NA NA NA <NA> # NA.17 <NA> NA NA NA <NA> # NA.18 <NA> NA NA NA <NA> # NA.19 <NA> NA NA NA <NA> # 43 Glee Anselm 33 206 15600 tropical, temperate # NA.20 <NA> NA NA NA <NA> # NA.21 <NA> NA NA NA <NA> # NA.22 <NA> NA NA NA <NA> # NA.23 <NA> NA NA NA <NA> # NA.24 <NA> NA NA NA <NA> # NA.25 <NA> NA NA NA <NA> # NA.26 <NA> NA NA NA <NA> # NA.27 <NA> NA NA NA <NA> # NA.28 <NA> NA NA NA <NA> # NA.29 <NA> NA NA NA <NA> # 54 Ojom NA NA NA frigid # NA.30 <NA> NA NA NA <NA> # NA.31 <NA> NA NA NA <NA> # NA.32 <NA> NA NA NA <NA> # NA.33 <NA> NA NA NA <NA> # NA.34 <NA> NA NA NA <NA> # gravity terrain surface_water population # 3 1.1 standard tundra, ice caves, mountain ranges 100 NA # NA <NA> <NA> NA NA # 9 1 standard ocean 100 1.0e+09 # 13 1 standard jungle, forests, lakes, rivers 60 4.5e+07 # NA.1 <NA> <NA> NA NA # NA.2 <NA> <NA> NA NA # NA.3 <NA> <NA> NA NA # NA.4 <NA> <NA> NA NA # NA.5 <NA> <NA> NA NA # NA.6 <NA> <NA> NA NA # 21 1 standard plains, urban, hills, forests 70 3.0e+09 # 22 1 standard jungles, oceans, urban, swamps 60 1.3e+09 # NA.7 <NA> <NA> NA NA # NA.8 <NA> <NA> NA NA # 25 rocky islands, oceans 98 6.2e+07 # NA.9 <NA> <NA> NA NA # NA.10 <NA> <NA> NA NA # NA.11 <NA> <NA> NA NA # 30 1 oceans, reefs, islands 100 2.7e+10 # NA.12 <NA> <NA> NA NA # NA.13 <NA> <NA> NA NA # NA.14 <NA> <NA> NA NA # NA.15 <NA> <NA> NA NA # NA.16 <NA> <NA> NA NA # NA.17 <NA> <NA> NA NA # NA.18 <NA> <NA> NA NA # NA.19 <NA> <NA> NA NA # 43 1 lakes, islands, swamps, seas 80 5.0e+08 # NA.20 <NA> <NA> NA NA # NA.21 <NA> <NA> NA NA # NA.22 <NA> <NA> NA NA # NA.23 <NA> <NA> NA NA # NA.24 <NA> <NA> NA NA # NA.25 <NA> <NA> NA NA # NA.26 <NA> <NA> NA NA # NA.27 <NA> <NA> NA NA # NA.28 <NA> <NA> NA NA # NA.29 <NA> <NA> NA NA # 54 oceans, glaciers 100 5.0e+08 # NA.30 <NA> <NA> NA NA # NA.31 <NA> <NA> NA NA # NA.32 <NA> <NA> NA NA # NA.33 <NA> <NA> NA NA # NA.34 <NA> <NA> NA NA # created edited # 3 2014-12-10T11:39:13.934000Z 2014-12-20T20:58:18.423000Z # NA <NA> <NA> # 9 2014-12-10T12:45:06.577000Z 2014-12-20T20:58:18.434000Z # 13 2014-12-10T13:32:00.124000Z 2014-12-20T20:58:18.442000Z # NA.1 <NA> <NA> # NA.2 <NA> <NA> # NA.3 <NA> <NA> # NA.4 <NA> <NA> # NA.5 <NA> <NA> # NA.6 <NA> <NA> # 21 2014-12-10T16:49:12.453000Z 2014-12-20T20:58:18.456000Z # 22 2014-12-10T17:03:28.110000Z 2014-12-20T20:58:18.458000Z # NA.7 <NA> <NA> # NA.8 <NA> <NA> # 25 2014-12-12T11:16:55.078000Z 2014-12-20T20:58:18.463000Z # NA.9 <NA> <NA> # NA.10 <NA> <NA> # NA.11 <NA> <NA> # 30 2014-12-18T11:07:01.792000Z 2014-12-20T20:58:18.471000Z # NA.12 <NA> <NA> # NA.13 <NA> <NA> # NA.14 <NA> <NA> # NA.15 <NA> <NA> # NA.16 <NA> <NA> # NA.17 <NA> <NA> # NA.18 <NA> <NA> # NA.19 <NA> <NA> # 43 2014-12-20T10:18:26.110000Z 2014-12-20T20:58:18.495000Z # NA.20 <NA> <NA> # NA.21 <NA> <NA> # NA.22 <NA> <NA> # NA.23 <NA> <NA> # NA.24 <NA> <NA> # NA.25 <NA> <NA> # NA.26 <NA> <NA> # NA.27 <NA> <NA> # NA.28 <NA> <NA> # NA.29 <NA> <NA> # 54 2014-12-20T17:27:41.286000Z 2014-12-20T20:58:18.516000Z # NA.30 <NA> <NA> # NA.31 <NA> <NA> # NA.32 <NA> <NA> # NA.33 <NA> <NA> # NA.34 <NA> <NA> # url # 3 http://swapi.co/api/planets/4/ # NA <NA> # 9 http://swapi.co/api/planets/10/ # 13 http://swapi.co/api/planets/14/ # NA.1 <NA> # NA.2 <NA> # NA.3 <NA> # NA.4 <NA> # NA.5 <NA> # NA.6 <NA> # 21 http://swapi.co/api/planets/22/ # 22 http://swapi.co/api/planets/23/ # NA.7 <NA> # NA.8 <NA> # 25 http://swapi.co/api/planets/26/ # NA.9 <NA> # NA.10 <NA> # NA.11 <NA> # 30 http://swapi.co/api/planets/31/ # NA.12 <NA> # NA.13 <NA> # NA.14 <NA> # NA.15 <NA> # NA.16 <NA> # NA.17 <NA> # NA.18 <NA> # NA.19 <NA> # 43 http://swapi.co/api/planets/44/ # NA.20 <NA> # NA.21 <NA> # NA.22 <NA> # NA.23 <NA> # NA.24 <NA> # NA.25 <NA> # NA.26 <NA> # NA.27 <NA> # NA.28 <NA> # NA.29 <NA> # 54 http://swapi.co/api/planets/55/ # NA.30 <NA> # NA.31 <NA> # NA.32 <NA> # NA.33 <NA> # NA.34 <NA> # desc # 3 Hoth is an ice planet in the Star Wars fictional universe. It first appeared in the 1980 film The Empire Strikes Back and has also been a setting in Star Wars books and video games. # NA <NA> # 9 # 13 Kashyyyk (/kəˈʃiːk/ ka-SHEEK, /ˈkæʃɪk/ KASH-ik or /ˌkæˈʃiː.aɪk/ ka-SHEE-ike), also known as Wookiee Planet C, is a fictional planet in the Star Wars universe. It is the tropical, forested home world of the Wookiees. According to interviews given by Star Wars creator George Lucas, the home of the Wookiees was originally intended to be the forest moon of Endor which plays a key role in the plot of the sixth film of the series, Return of the Jedi.[1] However, Lucas decided that since the Wookiee Chewbacca was clearly proficient with advanced technology (i.e. he was pilot and mechanic of the spaceship the Millennium Falcon and he repaired the damaged droid C-3PO), it would be confusing to show the Wookiees with a primitive, "stone age" culture on Endor. The Ewoks were created instead to populate the moon and to help fight the Imperial garrison stationed there.[2] Kashyyyk made appearances in the Star Wars Holiday Special and Star Wars: Episode III – Revenge of the Sith. # NA.1 <NA> # NA.2 <NA> # NA.3 <NA> # NA.4 <NA> # NA.5 <NA> # NA.6 <NA> # 21 # 22 # NA.7 <NA> # NA.8 <NA> # 25 # NA.9 <NA> # NA.10 <NA> # NA.11 <NA> # 30 # NA.12 <NA> # NA.13 <NA> # NA.14 <NA> # NA.15 <NA> # NA.16 <NA> # NA.17 <NA> # NA.18 <NA> # NA.19 <NA> # 43 # NA.20 <NA> # NA.21 <NA> # NA.22 <NA> # NA.23 <NA> # NA.24 <NA> # NA.25 <NA> # NA.26 <NA> # NA.27 <NA> # NA.28 <NA> # NA.29 <NA> # 54 # NA.30 <NA> # NA.31 <NA> # NA.32 <NA> # NA.33 <NA> # NA.34 <NA> ``` --- O también con subset, ignora los NA ```r subset(planets, surface_water > 50) # name rotation_period orbital_period diameter climate # 3 Hoth 23 549 7200 frozen # 9 Kamino 27 463 19720 temperate # 13 Kashyyyk 26 381 12765 tropical # 21 Corellia 25 329 11000 temperate # 22 Rodia 29 305 7549 hot # 25 Bestine IV 26 680 6400 temperate # 30 Mon Cala 21 398 11030 temperate # 43 Glee Anselm 33 206 15600 tropical, temperate # 54 Ojom NA NA NA frigid # gravity terrain surface_water population # 3 1.1 standard tundra, ice caves, mountain ranges 100 NA # 9 1 standard ocean 100 1.0e+09 # 13 1 standard jungle, forests, lakes, rivers 60 4.5e+07 # 21 1 standard plains, urban, hills, forests 70 3.0e+09 # 22 1 standard jungles, oceans, urban, swamps 60 1.3e+09 # 25 rocky islands, oceans 98 6.2e+07 # 30 1 oceans, reefs, islands 100 2.7e+10 # 43 1 lakes, islands, swamps, seas 80 5.0e+08 # 54 oceans, glaciers 100 5.0e+08 # created edited # 3 2014-12-10T11:39:13.934000Z 2014-12-20T20:58:18.423000Z # 9 2014-12-10T12:45:06.577000Z 2014-12-20T20:58:18.434000Z # 13 2014-12-10T13:32:00.124000Z 2014-12-20T20:58:18.442000Z # 21 2014-12-10T16:49:12.453000Z 2014-12-20T20:58:18.456000Z # 22 2014-12-10T17:03:28.110000Z 2014-12-20T20:58:18.458000Z # 25 2014-12-12T11:16:55.078000Z 2014-12-20T20:58:18.463000Z # 30 2014-12-18T11:07:01.792000Z 2014-12-20T20:58:18.471000Z # 43 2014-12-20T10:18:26.110000Z 2014-12-20T20:58:18.495000Z # 54 2014-12-20T17:27:41.286000Z 2014-12-20T20:58:18.516000Z # url # 3 http://swapi.co/api/planets/4/ # 9 http://swapi.co/api/planets/10/ # 13 http://swapi.co/api/planets/14/ # 21 http://swapi.co/api/planets/22/ # 22 http://swapi.co/api/planets/23/ # 25 http://swapi.co/api/planets/26/ # 30 http://swapi.co/api/planets/31/ # 43 http://swapi.co/api/planets/44/ # 54 http://swapi.co/api/planets/55/ # desc # 3 Hoth is an ice planet in the Star Wars fictional universe. It first appeared in the 1980 film The Empire Strikes Back and has also been a setting in Star Wars books and video games. # 9 # 13 Kashyyyk (/kəˈʃiːk/ ka-SHEEK, /ˈkæʃɪk/ KASH-ik or /ˌkæˈʃiː.aɪk/ ka-SHEE-ike), also known as Wookiee Planet C, is a fictional planet in the Star Wars universe. It is the tropical, forested home world of the Wookiees. According to interviews given by Star Wars creator George Lucas, the home of the Wookiees was originally intended to be the forest moon of Endor which plays a key role in the plot of the sixth film of the series, Return of the Jedi.[1] However, Lucas decided that since the Wookiee Chewbacca was clearly proficient with advanced technology (i.e. he was pilot and mechanic of the spaceship the Millennium Falcon and he repaired the damaged droid C-3PO), it would be confusing to show the Wookiees with a primitive, "stone age" culture on Endor. The Ewoks were created instead to populate the moon and to help fight the Imperial garrison stationed there.[2] Kashyyyk made appearances in the Star Wars Holiday Special and Star Wars: Episode III – Revenge of the Sith. # 21 # 22 # 25 # 30 # 43 # 54 ``` --- Podemos quitar los 'NA' de los datasets con el siguiente comando ```r clean_planets <- planets[!is.na(planets),] ``` **Ejercicio: Del dataset clean_planets, obtén los nombres de los planetas cuyo diámetro sea menor a 10,000 y que su clima sea solo "temperate"** --- **Ejercicio: Del dataset clean_planets, obtén los nombres de los planetas cuyo diámetro sea menor a 10,000 y que su clima sea solo "temperate"** ```r subset(clean_planets, (diameter < 10000) & (climate == "temperate"), select = name) # name # 6 Endor # 19 Stewjon # 24 Dantooine # 25 Bestine IV # 33 Toydaria ``` --- ### Rownames - Te darás cuenta que cuando hacemos `subset`, en consola se imprime un número antes de nuestros datos deseados. Estos corresponden a las rownames o nombres de las filas del dataset. ```r rownames(planets) # [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" # [16] "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" # [31] "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" # [46] "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" # [61] "61" ``` - Podemos renombrar las rownames, reemplazandolas por un vector de la misma longitud ```r length(rownames(planets)) # [1] 61 ``` **Ejercicio: renombra las rownames con números aleatorios del 600-700, utiliza la función `sample`** ```r ?sample ``` --- Utilizando `sample`, generamos una muestra de tamaño n. Con `replace = FALSE`, le decimos que no queremos que se repitan los valores muestreados. ```r n = length(rownames(planets)) new_rownames <- sample(600:700, n, replace = FALSE) new_rownames # [1] 608 603 612 697 676 693 641 609 692 651 616 677 670 690 653 615 647 626 635 # [20] 601 652 605 689 634 629 621 654 655 660 642 622 614 683 663 686 678 643 658 # [39] 620 600 674 648 636 623 691 638 700 656 659 682 646 637 662 680 664 666 606 # [58] 699 667 672 618 ``` Sustituimos por los nuevos rownames ```r rownames(planets) <- new_rownames ``` ```r rownames(planets) # [1] "608" "603" "612" "697" "676" "693" "641" "609" "692" "651" "616" "677" # [13] "670" "690" "653" "615" "647" "626" "635" "601" "652" "605" "689" "634" # [25] "629" "621" "654" "655" "660" "642" "622" "614" "683" "663" "686" "678" # [37] "643" "658" "620" "600" "674" "648" "636" "623" "691" "638" "700" "656" # [49] "659" "682" "646" "637" "662" "680" "664" "666" "606" "699" "667" "672" # [61] "618" ``` --- ### Operaciones aritméticas básicas Estas son las operaciones aritméticas básicas en R. ```r suma <- 5 + 3 resta <- 5 - 3 multiplicacion <- 4 * 6 division <- 4 / 3 exponente <- 4**2 # tambien 4^2 modulo <- 10%%3 division_exacta <- 10%/%3 ``` Podemos realizar operaciones con variables, constantes y/o expresiones, solo recordemos el orden de las operaciones ```r resultado <- (suma + resta) **2 # (8 + 2)^2 resultado # [1] 100 ``` --- ## Antes de terminar: ```r save.image(paste0(indir, miAmbiente1.RData)) ``` ```r sessionInfo() # R version 4.2.2 (2022-10-31) # Platform: x86_64-apple-darwin17.0 (64-bit) # Running under: macOS Big Sur ... 10.16 # # Matrix products: default # BLAS: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRblas.0.dylib # LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib # # locale: # [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 # # attached base packages: # [1] stats graphics grDevices utils datasets methods base # # other attached packages: # [1] xaringanthemer_0.4.2 emo_0.0.0.9000 fontawesome_0.5.2 # [4] icons_0.2.0 xaringanExtra_0.7.0 lubridate_1.9.2 # [7] forcats_1.0.0 stringr_1.5.0 dplyr_1.1.3 # [10] purrr_1.0.2 readr_2.1.4 tidyr_1.3.0 # [13] tibble_3.2.1 ggplot2_3.4.3 tidyverse_2.0.0 # [16] knitr_1.44 # # loaded via a namespace (and not attached): # [1] bslib_0.5.1 compiler_4.2.2 pillar_1.9.0 jquerylib_0.1.4 # [5] tools_4.2.2 uuid_1.1-1 digest_0.6.33 timechange_0.2.0 # [9] jsonlite_1.8.7 evaluate_0.21 lifecycle_1.0.3 gtable_0.3.4 # [13] pkgconfig_2.0.3 rlang_1.1.1 cli_3.6.1 rstudioapi_0.15.0 # [17] yaml_2.3.7 xfun_0.40 fastmap_1.1.1 withr_2.5.1 # [21] rappdirs_0.3.3 hms_1.1.3 generics_0.1.3 sass_0.4.7 # [25] vctrs_0.6.3 grid_4.2.2 tidyselect_1.2.0 glue_1.6.2 # [29] R6_2.5.1 fansi_1.0.4 rmarkdown_2.25 xaringan_0.28 # [33] tzdb_0.4.0 magrittr_2.0.3 scales_1.2.1 htmltools_0.5.6 # [37] assertthat_0.2.1 colorspace_2.1-0 utf8_1.2.3 stringi_1.7.12 # [41] munsell_0.5.0 cachem_1.0.8 crayon_1.5.2 ``` --- .center[<img src = "figures/meme5.jpeg", height = "600">] ---