Cápsula 3

1 Objetos y estructuras en R

1.1 Factores

En R, un factor es un tipo de dato utilizado para representar variables categóricas, como grupos o categorías. Los factores permiten manejar datos categóricos (por ejemplo, “Bajo”, “Medio”, “Alto”) de manera más eficiente en comparación con los caracteres o enteros.

Los factores tienen niveles (levels), que representan los distintos valores o categorías posibles de la variable, y también un atributo de orden (ordered) que indica si los niveles tienen un orden lógico. Por ejemplo, si tienes una variable que representa el nivel de educación, podrías tener un factor con los niveles “Primaria”, “Secundaria”, “Universitaria”.

1.1.1 Características de un factor

  • Niveles (Levels): Los valores únicos que la variable puede tomar. Cada nivel es una categoría.

  • Etiquetas (Labels): Los nombres asociados a cada nivel, que pueden ser diferentes a los valores originales.

  • Ordenado o no (Ordered): Indica si las categorías tienen un orden lógico.

Por ejemplo, supongamos que nos interesa registrar el nivel más alto de educación formal que han completado las personas en nuestros datos. Las categorías discretas que nos interesan son:

1 = Secundaria incompleta

2 = Graduado de secundaria

3 = Universitario incompleto

4 = Graduado universitario

Normalmente, no creamos factores desde cero. En su lugar, normalmente convertimos (o “forzamos”) un vector numérico o de caracteres existente en un factor. Por ejemplo, podemos forzar education_numun factor de la siguiente manera:

# Creo un vector con los numeros correspondientes a las categorias de educación


educacion_num <- c(3, 1, 4, 1)

educacion_num  # Convierto el vector en factor
[1] 3 1 4 1
educacion_num_f <- factor(
  x = educacion_num,
  levels = 1:4,
  labels = c(
    "secundaria incompleta",
    "Graduado de secundaria",
    "Universitario incompleto",
    "Graduado universitario"
  )
)   

educacion_num_f
[1] Universitario incompleto secundaria incompleta    Graduado universitario  
[4] secundaria incompleta   
4 Levels: secundaria incompleta ... Graduado universitario

Importante: El orden de las etiquetas en el vector de caracteres que pasamos al labels argumento debe coincidir con el orden de los valores que se pasan al levels argumento. Por ejemplo, el orden de levels y labels superior indica a R que 1 debe etiquetarse con “Menor que la escuela secundaria”, 2 debe etiquetarse con “Graduado de la escuela secundaria”, etc.

1.1.1.1 Tambien podemos convertir los factores a otro tipo de datos:

# Convertimos el factor en caracter

as.character(educacion_num_f)
[1] "Universitario incompleto" "secundaria incompleta"   
[3] "Graduado universitario"   "secundaria incompleta"   
# Convertimos el factor en número (teniendo en cuenta los niveles, no la etiqueta)

as.numeric(educacion_num_f)
[1] 3 1 4 1

2 Datos faltantes

En R, los datos faltantes se representan con NA, que significa Not Available. Este valor especial indica que no se tiene información para una determinada observación en el dataset, ya sea porque la información no se recogió, se perdió, o no se aplica.

2.0.1 Tipos de valores faltantes en R

  • NA (Not Available): Representa la falta de datos en general, aplicable a cualquier tipo de dato (numérico, carácter, factor, etc.).

  • NaN (Not a Number): Indica un valor indefinido, como el resultado de operaciones matemáticas que no tienen sentido, como 0/0.

  • NULL: Representa la ausencia total de valor o de objeto. Es diferente a NA, ya que NULL implica que el objeto no existe, mientras que NA implica que existe pero no tiene valor.

2.0.2 Identificación de datos faltantes

En R, puedes usar las siguientes funciones para identificar y trabajar con datos faltantes:

  • is.na(): Identifica si un valor o elemento en un vector, data frame o matriz es NA.

  • sum(is.na()): Cuenta cuántos valores faltantes hay en un vector o data frame.

  • complete.cases(): Devuelve un valor lógico que indica si una fila en un data frame o matriz no contiene ningún valor faltante.

Veamos un ejemplo de ello:

# Creamos un data frame   

df <- data.frame(
  nombres   = c("Juan", "Susana", "Monica", "Lucas"),
  peso = c(30, NA, 71, NA)
)    

df   # No tenemos el peso de Lucas ni de Susana
  nombres peso
1    Juan   30
2  Susana   NA
3  Monica   71
4   Lucas   NA

Identificamos si existen NA en nuestro data frame:

is.na(df)
     nombres  peso
[1,]   FALSE FALSE
[2,]   FALSE  TRUE
[3,]   FALSE FALSE
[4,]   FALSE  TRUE

Contamos cuantos NA tenemos en nuestro data frame

sum(is.na(df))
[1] 2

Vemos si una columna tiene NA en nuestro data frame

complete.cases(df$peso)
[1]  TRUE FALSE  TRUE FALSE

3 Uso de tuberías

Las tuberías (pipes) en R se usan para conectar una secuencia de funciones y operaciones, facilitando la lectura y la escritura del código. En lugar de anidar funciones una dentro de otra, las tuberías permiten escribir código de manera secuencial, como una serie de pasos que se ejecutan en orden.

El operador más común para las tuberías es %>%, proporcionado por el paquete magrittr y popularizado por el paquete dplyr de la familia tidyverse.

El operador %>% se utiliza para pasar el resultado de una operación como la entrada de la siguiente. De esta forma, podemos encadenar varias operaciones de forma clara y concisa. Las tuberías nos permiten conservar los beneficios de anidar funciones sin hacer que nuestro código sea realmente difícil de leer.

Lo vemos con un ejemplo

 # Para utilizar la libreria quitar el hashtag   

library(dplyr)    

# Usar una tubería para filtrar   

df_limpio <- df  %>%    
  filter(!is.na(peso)) %>%
  filter(peso > 40 )


print(df_limpio)
  nombres peso
1  Monica   71

Recomendación de sintaxis con tuberías:

  • Utilizar tuberías de tal manera que cada línea de código hace una, y sólo una, cosa.

  • Si una línea de código contiene un operador de tubería, este generalmente debe ser lo último que se escriba en la línea.

  • El operador de la tubería siempre debe tener un espacio delante de la misma.

  • Si el operador de tubería no es lo último que se escribe en la línea, entonces también debería tener un espacio después.

4 Rutas de archivos en R

El directorio de trabajo es la ubicación de la carpeta raíz que R utiliza para su trabajo, donde R busca y guarda archivos de manera predeterminada. De manera predeterminada, guardará los archivos y resultados nuevos en esta ubicación y también buscará archivos para importar (por ejemplo, conjuntos de datos) aquí.

El directorio de trabajo aparece en texto gris en la parte superior del panel de la consola RStudio. También puede imprimir el directorio de trabajo actual ejecutando getwd()(deje los paréntesis vacíos).

# Directorio donde R trabaja en tu computadora    

getwd()
[1] "C:/Users/mflor/OneDrive/Documentos/OPS 2024/VigilanciaenR_2/Sesión 1"

4.0.1 Creación de Proyecto R

Es recomendable siempre armar en principio un proyecto R y desde allí gestionar los archivos con los que trabajaremos. Si utiliza un proyecto R, el directorio de trabajo predeterminado será la carpeta raíz del proyecto R que contiene el archivo “.rproj”. Esto se aplicará si abre RStudio haciendo clic en Abrir proyecto R (el archivo con la extensión “.rproj”).

Observar que las barras que delimitan subdirectorios son / o \. Nunca usar solo la . Ya que en R en Window es necesario esto.

4.0.1.1 Ruta Absoluta:

Una ruta absoluta es la dirección completa que especifica la ubicación exacta de un archivo en tu sistema de archivos, empezando desde el directorio raíz (la carpeta principal del sistema). Siempre incluye el disco o la carpeta raíz (por ejemplo, C: en Windows o / en Linux/Mac).

Aquí, la ruta absoluta indica dónde se encuentra el archivo en todo el sistema, y no importa desde qué proyecto estés trabajando, siempre buscará en esa ruta específica

# read.csv("C:/Usuarios/TuNombre/Documentos/datos.csv")

4.0.1.2 Ruta de archivos relativa:

Una ruta relativa es la dirección de un archivo basada en la ubicación actual en la que estás trabajando, como el directorio de trabajo de tu proyecto en R. Es más flexible porque cambia dependiendo de dónde estés trabajando. La ruta empieza desde tu ubicación actual, sin necesidad de especificar todo el camino desde el directorio raíz.

En general, es recomandeble proporcionar rutas de archivo “relativas”, una ruta de archivo relativa podría verse así:

# read.csv("data/datos.csv")