Material para clase sincrónica

1 Ejercicio N°1

1.1 Creación de marco de datos R

En primer lugar vamos a generar un marco de datos o data frame, desde donde vamos a contener y manipular datos.

Simplifica mucho para la escritura y nomenclatura de variables el uso de minúsculas y evitar espacios entre palabras.

Variable como una caja, que tiene una etiqueta que es el nombre de la variable. Dentro de la caja podemos guardar un valor.

a <- 1

print(a)
[1] 1
b <- 2
b
[1] 2
a +3
[1] 4

Importante el orden de como se corren los códigos

b+3
[1] 5

Variable de caracter

c <- "casos"

c
[1] "casos"

Un vector es un grupo elementos ordenados, todos deben ser del mismo tipo (todos números o todos caracteres por ejemplo). La forma más simple de crear un vector es usando la función c() y separando por comas a los elementos que lo forman:

# creación de vector simple

casos_dengue <- c("confirmado", "sospechoso", "confirmado", "sospechoso")

# imprime el vector

casos_dengue
[1] "confirmado" "sospechoso" "confirmado" "sospechoso"
class(casos_dengue)
[1] "character"
edad <- c(23,65,89,45,33,21,42)

edad
[1] 23 65 89 45 33 21 42
class(edad)
[1] "numeric"

Podemos concatenar nuestras dos variables con c()

casos_2 <- c(casos_dengue,edad)

casos_2
 [1] "confirmado" "sospechoso" "confirmado" "sospechoso" "23"        
 [6] "65"         "89"         "45"         "33"         "21"        
[11] "42"        

[1] en el resultado los numeros en corchetes marcan la pocicion que ocupan las vacriables en los vectores.

Ahora la edad se muestra como caracter

class(casos_2)
[1] "character"
a<-c(1:8) #Es lo mismo que escribir c(1,2,3,4)

a
[1] 1 2 3 4 5 6 7 8

¿Que hace si operamos vectores de diferentes longitudes? R aplica una técnica llamada “recycling” o reciclaje

vector1 <- c(1, 2, 3, 4, 5)  # Longitud 5
vector2 <- c(10, 20)        # Longitud 2

# Realiza una operación aritmética
resultado <- vector1 + vector2

resultado
[1] 11 22 13 24 15
  • vector1 tiene 5 elementos: 1, 2, 3, 4, 5

  • vector2 tiene 2 elementos: 10, 20

Cuando sumas vector1 y vector2, R recicla vector2 para que coincida con la longitud de vector1. Esto significa que vector2 se repite para alinear con vector1:

  • La operación es equivalente a sumar vector1 con vector2 reciclado: (10, 20) se repite para igualar la longitud de vector1.

  • El reciclaje se realiza así: vector2 se convierte en 10, 20, 10, 20, 10

Entonces el cálculo es:

  • (1 + 10) = 11

  • (2 + 20) = 22

  • (3 + 10) = 13

  • (4 + 20) = 24

  • (5 + 10) = 15

Ahora generaremos otro vector y los combinamos:

id_caso <- c("1","2","3","4") 

id_caso
[1] "1" "2" "3" "4"

Combinación de vectores para crear un data frame o marco de datos. Este aparece ahora en el entorno global

# Creamos un data frame

df <- data.frame(
   caso_dengue = c("confirmado", "sospechoso", "confirmado", "descartado"),
   id_caso = c("1","2","3","4"))
  
df
  caso_dengue id_caso
1  confirmado       1
2  sospechoso       2
3  confirmado       3
4  descartado       4
ls()  # Muestra todos los objetos en el entorno global
 [1] "a"            "b"            "c"            "casos_2"      "casos_dengue"
 [6] "df"           "edad"         "id_caso"      "resultado"    "vector1"     
[11] "vector2"     
rm(df)          # Elimina el objeto 'x' del entorno global

Es lo mismo que:

df <- data.frame(casos_dengue,id_caso)

df
  casos_dengue id_caso
1   confirmado       1
2   sospechoso       2
3   confirmado       3
4   sospechoso       4

Se puede luego agregar una tercera columna con edades por ejemplo. Es importate tener la misma cantidad de filas y columnas.

edad <- c(34,65,13,25)

df_2 <- data.frame(casos_dengue,id_caso,edad)
df_2
  casos_dengue id_caso edad
1   confirmado       1   34
2   sospechoso       2   65
3   confirmado       3   13
4   sospechoso       4   25

R ahora lo reconoce df_2como un objeto con el que podemos hacer cosas y reemplaza al anterior porque se llama igual

nrow(df_2)#nos dice el numero de filas del DF
[1] 4
ncol(df_2)#nos dice la cantidad de columnas de DF
[1] 3
dim(df_2)# nos devuelve un vector con los valores filas y columnas de DF
[1] 4 3
colnames(df_2)#nos dice los nombres de las columnas del DF
[1] "casos_dengue" "id_caso"      "edad"        
summary(df_2)#Nos retorna información de cada variable que forma el df
 casos_dengue         id_caso               edad      
 Length:4           Length:4           Min.   :13.00  
 Class :character   Class :character   1st Qu.:22.00  
 Mode  :character   Mode  :character   Median :29.50  
                                       Mean   :34.25  
                                       3rd Qu.:41.75  
                                       Max.   :65.00  
  • Length: 4: La columna edad tiene 4 elementos.

  • Min. :13.00: El valor mínimo en la columna edad es 13 años.

  • 1st Qu.:22.00: El primer cuartil (Q1) es 22 años. Esto significa que el 25% de los datos están por debajo de 22 años.

  • Median :29.50: La mediana es 29.5 años. La mediana divide los datos en dos mitades; la mitad de los valores son menores o iguales a 29.5 años y la otra mitad son mayores o iguales.

  • Mean :34.25: La media o promedio de la columna edad es 34.25 años.

  • 3rd Qu.:41.75: El tercer cuartil (Q3) es 41.75 años. Esto indica que el 75% de los datos están por debajo de 41.75 años.

  • Max. :65.00: El valor máximo en la columna edad es 65 años.

Marcadores de posición [ ]y funcionalidades de base de R

Si queremos acceder a una variable en especifico debemos marcar entre corchetes y comas las posiciones que buscamos:

Primero se coloca la fila y luego la columna

df_2[2,1]
[1] "sospechoso"

Es decir accedemos a la segunda fila y la primera columna

Si dejamos en blanco las filas R interpreta que queremos seleccionar toda una columna. Por ejemplo, queremos emplear todos los elementos de la primera columna.

df_2[ ,1]
[1] "confirmado" "sospechoso" "confirmado" "sospechoso"

o también podemos seleccionar todos los elementos de una fila

df_2[2, ]
  casos_dengue id_caso edad
2   sospechoso       2   65

Si queremos modificar el valor de una columna tambien usamos corchetes:

df_2[2,1] <- "confirmado"

df_2
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65
3   confirmado       3   13
4   sospechoso       4   25

1.2 Manipulación con dplyr

Sus funciones principales, como filter(), select(), mutate(), summarize() y arrange()es parte del tidyverse, que es un conjunto de paquetes en R diseñados para el análisis de datos y la ciencia de datos.

Por ejemplo algunas variables que R puede tomar como carcateres las queremos pasar a numéricas para poder manipularlas.

1.3 Seleccionar columnas

Usando la sintaxis base de R tambien podemos hacer con $

Seleccionar una columna (como id_caso):

df_2$id_caso
[1] "1" "2" "3" "4"

Seleccionar múltiples columnas (como id_caso y edad):

df_2[c("id_caso", "edad")]
  id_caso edad
1       1   34
2       2   65
3       3   13
4       4   25

Usando la función select() de library(dplyr)

Seleccionar datos del data frame:

library(dplyr)
# Selecciono del marco de datos df_2 la columna de id_caso

select(df_2,id_caso)
  id_caso
1       1
2       2
3       3
4       4
# Selecciono del marco de datos df_2 mas de una columna

select(df_2, id_caso, edad)
  id_caso edad
1       1   34
2       2   65
3       3   13
4       4   25
# Esto no se guardará en un nuevo data frame si no le asignamos un nombre a una nueva variable

Siempre se escibre: Select (.data, columna)

# Puedo seleccionar columnas por posición

select(df_2,(2:3))
  id_caso edad
1       1   34
2       2   65
3       3   13
4       4   25

Reordenar columnas por nombre

# Reordenar columnas por nombre

select(df_2,edad, id_caso, casos_dengue)
  edad id_caso casos_dengue
1   34       1   confirmado
2   65       2   confirmado
3   13       3   confirmado
4   25       4   sospechoso

Mover una columna al principio

select(df_2, casos_dengue, everything())
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65
3   confirmado       3   13
4   sospechoso       4   25

Renombrar columnas

Podemos hacerlo con la función rename()

rename(df_2,
       id_lab = id_caso)
  casos_dengue id_lab edad
1   confirmado      1   34
2   confirmado      2   65
3   confirmado      3   13
4   sospechoso      4   25

1.4 Seleccionar filas

Usando la sintaxis base de R:

# Seleccionar múltiples filas, por ejemplo, las primeras dos filas:

df_2[1:2, ]
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65
# Seleccionar las filas donde la edad de la columna edad es mayor a 30

df_2[df_2$edad > 30, ]
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65

Usando la función filter() de library(dplyr)

Para que funcione, la filter()función requiere que le pasemos dos valores.

El primer valor es el nombre del objeto del marco de datos con las filas que queremos subdividir. El segundo es la condición que se utiliza para subdividir las filas. Supongamos que queremos hacer un análisis de subgrupos utilizando solo los casos confirmados.

# Elegimos solo casos confirmados

filter(df_2, casos_dengue == "confirmado")
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65
3   confirmado       3   13
# Seleccionamos solo cuando tengan más de 30 años

filter(df_2, edad > 30)
  casos_dengue id_caso edad
1   confirmado       1   34
2   confirmado       2   65
# ultimas filas del data frame contando desde la última

slice_tail(df_2, n = 3)
  casos_dengue id_caso edad
1   confirmado       2   65
2   confirmado       3   13
3   sospechoso       4   25

Función summarize()

Esta función permite calcular estadísticas agregadas o resumidas de una o más variables dentro de un grupo.

  summarize( df_2,
    media_valor = mean(edad),
    suma_valor = sum(edad)
  )
  media_valor suma_valor
1       34.25        137

El sumaize se usa mucho con group_bypara calcular resúmenes (sumas, promedios, conteos, etc.) sobre subconjuntos de datos, basados en los grupos que defines. Sirve para realizar cálculos agregados sobre grupos de datos, de manera estructurada

# Primero agrupar los datos por la columna 'casos_dengue'
# Luego sumar la columna 'edad' para cada grupo

# group_by() a una columna, R "agrupa" todas las filas que tienen el mismo valor en esa columna. 

df_resumen <- df_2 %>%
  group_by(casos_dengue) %>%
  summarize(suma_edad = sum(edad))

df_resumen
# A tibble: 2 × 2
  casos_dengue suma_edad
  <chr>            <dbl>
1 confirmado         112
2 sospechoso          25

Función mutate() para la creación y modificación de columnas

La función mutate()del paquete dplyr en R se utiliza para agregar nuevas columnas a un data frame o modificar las columnas existentes.

# library(dplyr)  

df_num <- df_2 %>% 
  mutate(id = as.numeric(id_caso))  
df_num 
  casos_dengue id_caso edad id
1   confirmado       1   34  1
2   confirmado       2   65  2
3   confirmado       3   13  3
4   sospechoso       4   25  4
# Clasificar la edad

mutate(df_num,
       grupo_edad = if_else(edad < 30, "joven", "adulto"))
  casos_dengue id_caso edad id grupo_edad
1   confirmado       1   34  1     adulto
2   confirmado       2   65  2     adulto
3   confirmado       3   13  3      joven
4   sospechoso       4   25  4      joven
# if_else(condition, true, false, missing = NULL)

Función arrange() para ordenar

La función arrange() en el paquete dplyr se utiliza para ordenar las filas de un data frame

Sintaxis: arrange(.data, columnas)

# Ordenar segun edad

arrange(df_num, casos_dengue)
  casos_dengue id_caso edad id
1   confirmado       1   34  1
2   confirmado       2   65  2
3   confirmado       3   13  3
4   sospechoso       4   25  4
# Ordenar segun edad descendente

arrange(df_num, desc(edad))
  casos_dengue id_caso edad id
1   confirmado       2   65  2
2   confirmado       1   34  1
3   sospechoso       4   25  4
4   confirmado       3   13  3

2 Ejercicio n°2

2.1 Datos faltantes

En R, representamos los datos faltantes con un NA. Este valor R lo lee como un valor de tipo lógico a diferencia de numéricos o de caracter.

typeof(NA)
[1] "logical"

Hay que tener en cuenta que cuando se agrega un NA(lógico por defecto) a un vector con valores numéricos como por ejemplo: c(68, 63, 71, NA)), eso haría que tuvieras tres valores numéricos y un valor lógico en el mismo vector, lo cual no está permitido. Por lo tanto, R convertirá automáticamente el NANA_real_.

A nuestro marco de datos le agregaremos una columna y le indicaremos los datos faltantes

# Agrego una columna de región que tiene datos faltantes

df_na <- df_num %>%
  mutate(region = c("norte", "sin dato", "sur", "sin dato"))

df_na
  casos_dengue id_caso edad id   region
1   confirmado       1   34  1    norte
2   confirmado       2   65  2 sin dato
3   confirmado       3   13  3      sur
4   sospechoso       4   25  4 sin dato
# paso dato faltante a na (Not Available)

df_limpio <- df_na %>%
  mutate(region = na_if(region, "sin dato"))

df_limpio
  casos_dengue id_caso edad id region
1   confirmado       1   34  1  norte
2   confirmado       2   65  2   <NA>
3   confirmado       3   13  3    sur
4   sospechoso       4   25  4   <NA>

Función na_if

se utiliza para reemplazar valores específicos en un vector o columna con NA

na_if(x, y)

  • x: El vector o columna en el que deseas hacer la sustitución.

  • y: El valor que deseas reemplazar con NA.

3 Ejercicio n°3

3.1 Tuberías

Este |>es el operador de tubería. A partir de la versión 4.1, el operador de tubería es parte de la base de R. Antes de la versión 4.1, el operador de tubería solo estaba disponible en magrittr  y se utilizan ampliamente en el tidyverse (particularmente en paquetes como dplyr). La tubería importada del magrittrpaquete se veía así %>%.

La idea principal de una tubería es que el resultado de una operación se pasa como entrada (primer argumento) a la siguiente función.

En el tipo de Windows shift + control + m

Sintaxis básica:

objeto %>% funcion1() %>% funcion2() %>% funcion3()

Esto se traduce a que objeto es pasado primero a funcion1(), luego el resultado es pasado a funcion2(), y finalmente el resultado es usado en funcion3().

Partiendo de nuestro data frame anterior podemos utilizar las tuberias para filtrar, ordenar y seleccionar columnas.

df_tuberia <- df_na %>%
  filter(edad > 20) %>%         # Filtrar casos con edad mayor a 20
  arrange(desc(edad)) %>%       # Ordenar por edad en orden descendente
  select(casos_dengue, edad)     # Seleccionar solo las columnas 'casos_dengue' y 'edad'

# Mostrar el resultado
print(df_tuberia)
  casos_dengue edad
1   confirmado   65
2   confirmado   34
3   sospechoso   25

Estructura de una función:

nombre_funcion <- function(argumento1, argumento2, ...) {
  # Cuerpo de la función: operaciones y cálculos
  
  resultado <- argumento1 + argumento2  # Ejemplo de operación
  
  return(resultado)  # Devolver el resultado
}

3.2 Estructura Básica de una Función en R

  1. Definición de la Función:

    • Nombre de la Función: Define cómo se llamará la función.

    • Argumentos: Los parámetros que la función aceptará.

    • Cuerpo de la Función: Donde se escriben las instrucciones que realiza la función.

    • Valor de Retorno: El resultado que la función devuelve.

Ejemplo de una función:

# Definir la función
suma <- function(a, b) {
  resultado <- a + b  # Sumar los dos números
  return(resultado)   # Devolver el resultado
}

# Llamar a la función
resultado <- suma(5, 3)

# Imprimir el resultado
print(resultado)  # Imprime 8
[1] 8

3.3 ¿Qué es un Tibble?

Un tibble es una versión mejorada de un data frame en R. Aunque ambos sirven para almacenar datos en forma de tabla, los tibbles tienen algunas características adicionales que los hacen más fáciles de usar.

  • Los tibbles muestran solo las primeras 10 filas y las columnas que se ajustan en la pantalla, facilitando la visualización de datos grandes.

  • Las columnas se muestran con sus nombres completos, sin truncar el contenido, a menos que sea necesario.

Pasar de un data frame a un tibble:

# Convertir el data frame a tibble

df_tibble <- as_tibble(df_limpio)

df_tibble
# A tibble: 4 × 5
  casos_dengue id_caso  edad    id region
  <chr>        <chr>   <dbl> <dbl> <chr> 
1 confirmado   1          34     1 norte 
2 confirmado   2          65     2 <NA>  
3 confirmado   3          13     3 sur   
4 sospechoso   4          25     4 <NA>  

4 Paquetes y librerías: instalación y carga

Para realizar algunos ejercicios primero tendremos que instalar los paquetes. Un paquete en R es una colección organizada de funciones, datos y documentación que extiende las capacidades básicas del lenguaje. Los pasos para ello consisten primero en instalarlos y luego cargar las librerías.

Cargar las librerías en R significa hacer que las funciones y herramientas de un paquete estén disponibles para que puedas usarlas en tu sesión de R. Cuando instalas un paquete con install.packages(), se descarga y guarda en tu computadora, pero no se activa automáticamente. Para empezar a usarlo, necesitas “cargar” la librería en la sesión de R con la función library().

# install.packages("tidyverse")  #  manipulación y visualización de datos

# install.packages("data.table") # manipulación de grandes datasets

# install.packages("lubridate") # creación, manipulación y extracción de información temporal en R

# install.packages("readxl") #  lectura de archivos Excel

# install.packages("googlesheets4") # Permite leer, escribir y manipular hojas de cálculo alojadas en Google Drive

# install.packages("httpuv") #  es utilizado en segundo plano para manejar la autenticación OAuth cuando accedes a Google Sheets.

# install.packages("rmarkdown") #  crear documentos combinando texto, código y resultados de análisis en un solo archivo. 

# install.packages("tinytex") #  generar documentos en formato PDF con rmarkdown