Introducción a R e RStudio

R es un potente lenguaje de programación para análisis de datos, gráficos y, especialmente, análisis estadístico. Está disponible gratuitamente en www.r-project.org con binarios fáciles de instalar para Linux, macOS y Windows. Este Notebook ofrece una introducción a R, diseñada para estudiantes e investigadores. No se requiere experiencia previa, aunque es útil tener cierta familiaridad con lenguajes de scripting como Bash, Matlab o Python.
La mejor opción para programar en R es instalar RStudio o Visual Studio Code. Aquí aprenderemos algunos de los fundamentos de R y cómo cargar y procesar datos.



Una breve introducción

Al comenzar con R (o cualquier lenguaje de programación), aprendemos tres habilidades fundamentales:

  • 1. Leer código: Inicialmente, te Leer es el primer paso para familiarizarte con la lógica, los comandos y cómo se expresa R. Ejemplo: comprender el significado de mean(c(1, 2, 3)).
  • 2. Comprender el código: Aquí empiezas a comprender por qué existe ese código, qué hace y cómo se conecta con los datos. Ejemplo: darte cuenta de que mean() calcula la media y que c(1, 2, 3) crea un vector (¿y qué es un vector?).
  • 3. Escribir código: ¡La cumbre del aprendizaje! Con la práctica, empezarás a escribir tus propios scripts y funciones, ya sea para graficar, analizar o automatizar tareas. Ejemplo: crear un gráfico con plot(x, y) y ajustar los parámetros a tu gusto.

  • Comentarios

    Los comentarios son partes de un programa informático que se utilizan para describir un fragmento de código. Podemos crear un comentario usando el símbolo #.
    ¿Propósito de los comentarios? Legibilidad, ignorar parte del código y pseudocódigo.

    
    # Todo lo que empieza con # es un comentario y no se ejecuta.
    # Esto se usa para explicar la función del código.
    # o para dejar notas o recordatorios.
    # o para deshabilitar una línea de código.
    # o para que el código sea más legible u organizado.
                    

    Variable

    Se pueden asignar diferentes tipos de valores, como caracteres, números o valores lógicos, a una variable.

    
    x <- 10 # La forma más común de asignación
    y = 20 # También funciona                   
                    

    En R (y en prácticamente todos los lenguajes de programación), no se permiten espacios en los nombres de variables. Si intenta escribir:
    Puedes usar el guion bajo (_), el punto (.) o CamelCase para separar palabras en los nombres de las variables, como esto:

    
    edad del paciente <- 25                  
                    

    R generará un error porque creerá que intentas usar la variable de edad, llamar a la función "del", acceder al paciente... un completo desastre! Puedes usar el guion bajo (_), el punto (.) o CamelCase para separar palabras en los nombres de las variables, como esto:

    
    edad_del_paciente <- 25
    edad.del.paciente <- 25
    Edad_del_paciente <- 25
    EdadeDelPaciente <- 25                    
                    

    En otras palabras, siempre que cree una variable, evite los espacios y use caracteres válidos. Tenga en cuenta que, aunque cada ortografía es aceptable, cada una crea una variable diferente.


    R lo diferencia TODO

    Cuando hablamos o escribimos con otras personas, entendemos pequeños errores, variaciones del lenguaje y faltas de ortografía. R no es así.


    En R, "edad", "Edad", "edades" y "Edades" son nombres completamente diferentes. Esto se debe a que el lenguaje distingue entre mayúsculas y minúsculas.


    Y cada variable debe ser única dentro del mismo espacio de trabajo; es decir, cada vez que escribo de una forma diferente, creo un nuevo objeto. Esto es importante porque evita confusiones y garantiza que sepa exactamente qué variable está utilizando.
    Por lo tanto, cree nombres de variable que tengan sentido, sean fáciles de recordar y lo suficientemente diferentes como para que usted pueda trabajar con ellos.

    Reglas para nombrar variables:

  • El nombre de una variable se puede crear con letras, dígitos, puntos y guiones bajos.
  • Empieza con una letra (¡nunca con un número!).
  • Si el nombre de una variable empieza con un punto, no se pueden usar dígitos después.
  • R (al igual que otros lenguajes de programación) distingue entre mayúsculas y minúsculas. Esto significa que "age" y "Edad" son variables diferentes.
  • Evita los acentos y los caracteres especiales.
  • Sé descriptivo, pero no te excedas.
  • Escribe de forma sencilla y en un formato estandarizado.
  • Cuanto más clara sea la variable, más fácil será reutilizarla.
    Si_es_demasiado_larga_es_difícil_reutilizarla.
  • ¿Qué significa <-?

    Esta flecha se usa para asignar un valor a un objeto. Es como decir: "Pon este valor aquí dentro de esta pequeña caja". O: "x ahora vale 10 e y ahora vale 20".


    Pero la flecha "<-" es la forma tradicional y más utilizada en la comunidad de R, especialmente en estadística y ciencia de datos. Es como una tradición del lenguaje: muchos dicen que la flecha indica de dónde viene el valor y adónde va.


    En el teclado, para asignar un valor a "<-", se escribe "<" y luego "-", y R lo interpreta automáticamente como una asignación.

    Datos y tipos de datos

    En R, los datos se organizan típicamente en tablas (data frames), similares a hojas de cálculo de Excel. Cada columna representa una variable (edad, nombre, altura, etc.) y cada fila representa una observación (una persona, un animal, un experimento, etc.).
    Puede crear datos manualmente:


    
    # Existen varios tipos de datos en R, pero los más comunes son:
    # Números
    x <- 10.5 # Números decimales
    
    # Entero
    y <- 5L # Números enteros
    
    # Texto (los llamamos "strings")
    nombre <- "mi nombre es:" # Texto entre comillas (escribe tu nombre)
    
    # Lógico (booleano)
    verdadero <- VERDADERO # Verdadero
    falso <- FALSO # Falso
    
    # Vectores
    edades <- c(25, 30, 35) # Vector de números               
                    
    
                    

    c() es una función que significa "combinar" o "concatenar" y se utiliza para crear vectores.


    Todos los elementos de un vector deben ser del mismo tipo. Si no se usa c(), R no entenderá que se desea crear un vector y generará un error. Al usar c(), R entiende que se están combinando estos valores en un solo objeto, formando un vector.


    Siempre que se desee crear un vector con MÚLTIPLES valores, ya sean números, texto o valores lógicos.

    Data frame

    Un data frame es como una hoja de cálculo de Excel: cada columna es una variable y cada fila es una observación. Puedes importar tus propios datos o generarlo en R.
    Para generarlo:

    
    my_dataframe <- data.frame(
      Name = c("Camila", "Matias", "Juan"),
      Age = c(21,33,19),
      Student = c(TRUE, FALSE, TRUE)
    )
    
    my_dataframe                    
                    

    Matriz

    Una matriz es una tabla compuesta únicamente por números (o un solo tipo de datos), organizada en filas y columnas, como en matemáticas.

    
    m <- matrix(1:9, nrow = 3, ncol = 3)
    
    m                    
                    

    Strings

    En programación, las cadenas son secuencias de caracteres; es decir, cualquier conjunto de letras, números, símbolos o espacios. Se utilizan para representar texto.

    
    # Finding the length of a string
    nchar(my_string1)
    
    # Joining strings together
    paste(my_string1, "2023")
    
    #Splitting strings
    txt<-("R is the statistical analysis language")
    unlist(strsplit(txt, split = " "))                    
                    

    Vector

    Un vector es una estructura básica que almacena una colección de elementos del mismo tipo: pueden ser números, texto (cadenas), valores lógicos (VERDADERO/FALSO), etc. Los vectores pueden realizar operaciones como sumar, filtrar, comparar, etc.

    
    # Vector
    my_vector1 <- c(1,2,3)
    my_vector2 <- c(4,5,6)
    another_vector <- c("Camila", "Matias", "Juan")
    
    class(my_vector1)
    my_vector1                   
                    
    
    class(another_vector)
    another_vector                    
                    
    
    # Creating vectors with R functions
    my_name <- rep("Alejandra", times = 5)
    my_name
    
    my_seq <- rep(c(1,3,5), times = 3)
    my_seq
    
    my_seq <- rep(c(1,3,5), each = 3)
    my_seq
    
    my_seq <- -10:10
    my_seq
    
    my_seq <- seq(from = -10, to = 10, by = 2)
    my_seq                    
                    

    List

    Una lista es un "bolsillo" que puede contener cualquier cosa: números, texto, vectores, marcos de datos, ¡incluso funciones!
    Imagina una lista de la compra: Jabón, Suavizante, Manzana, Naranja, Galletas, Pan etc...

    Observa que los artículos no pertenecen a las mismas categorías (alimentos, productos de limpieza, productos de higiene), pero todos están en la misma lista. Funciona de forma similar en R:

    
    my_list <- list(City = "Salvador", Age = 476, Beaches = c(Barra, Itapuã, Piatã, Ribeira))
    
    my_list                    
                    

    Factor

    Un factor se utiliza para representar variables categóricas, como "sexo", "estado civil" o "respuesta sí/no". En segundo plano, R trata estos valores como niveles numéricos con nombre.

    
    sex <- factor(c("F", "M", "F"))                    
                    

    R entiende esto como una variable con dos niveles: «F» y «M».

    Los factores son esenciales en el análisis estadístico porque tratan las categorías como niveles distintos, no como cualquier texto.

    Operations in R

    R es un lenguaje creado por matemáticos para resolver problemas estadísticos y matemáticos. Por lo tanto, realizar operaciones en este lenguaje es bastante similar a lo que ya conocemos en las matemáticas tradicionales.

    
    my_result <- 2 + 3
    
    1 - my_result
    
    6 * 4
    
    2 ^ 3
    
    10 / 5
    
    log10(1000)
    
    log2(32)
    
    sqrt(144)                    
                    

    Vector Operations

    
    my_vector1
    my_vector2                    
                    
    
    # Finding the length of a vector
    length(my_vector1)                    
                    
    
    # Math
    my_vector1 * my_vector2
    my_vector1 + my_vector2
    my_vector1 - my_vector2
    my_vector1 / my_vector2                    
                    
    
    # Indexing is a way to select (include/exclude) particular elements from a variable
    my_vector2
    my_vector2[1]
    my_vector2[-c(1,3)]
    my_vector2[2:3]
    my_vector2[c(1,3)] # First and third only                    
                    
    
    # Create a vector with some random values
    some_values <- c(8, 6, 1, 12, 3)
    
    mean(some_values)
    
    median(some_values)
    
    sort(some_values)
    
    # Quartiles  (25% vs 75%)
    quantile(some_values, 0.25)
    quantile(some_values, 0.75)
    
    # Interquartile range
    IQR(some_values)
    
    # Standard deviation
    #In R, the standard deviation and the variance are computed as if the data represent a sample (n - 1)
    sd(some_values)
    
    # Variance
    var(some_values)
                    

    Packages (o bibliotecas)

    Los packages son conjuntos de funciones predefinidas que te ayudan a realizar tareas específicas. Por ejemplo:

  • ggplot2 — para gráficos elegantes
  • dplyr — para manipular datos
  • readr — para leer archivos
  • Antes de usar un paquete, necesitas:
  • 
    # 1. Instalar (solo una vez):
    install.packages("ggplot2")                    
                    
    
    # 2. Cargar (cada vez que lo uses):
    library(ggplot2)                   
                    
    ¿Qué son las funciones?

    Las funciones son comandos predefinidos que hacen algo por ti. Ya has visto algunas arriba. Su estructura es la siguiente:

    
    nombre_función(argumento 1, argumento 2, ...)                    
                    
    
    #Por ejemplo:
    mean(c(1, 2, 3, 4))                    
                    
  • mean es el nombre de la función.
  • c(1, 2, 3, 4) es el argumento (un array de números).
  • Las funciones ahorran tiempo y organizan tus tareas. Hay cientos de ellas en R, e incluso puedes crear las tuyas propias o usar las de otros.
  • ¿Qué son los argumentos de una función?

    Cuando usamos una función en R, necesitamos pasarle la información necesaria para que sepa qué hacer. Esta información se llama argumentos; considéralos como los pasos de un experimento.

    
    round(3.14159, digits = 2)                    
                    

    Trazado de Datos Numéricos

    Existen varias maneras de crear gráficos en R, pero en esta lección nos centraremos en el paquete ggplot2, una herramienta potente y elegante para la visualización de datos. Se basa en la llamada gramática de grafos, que permite construir gráficos de forma estructurada e intuitiva, como si se escribieran frases con sentido.


    La gramática de grafos es un conjunto de reglas que define cómo construir visualizaciones de forma lógica y estandarizada. La gran ventaja es que, al seguir esta gramática, se aprende una estructura única que permite crear diferentes tipos de gráficos, sin tener que memorizar argumentos diferentes para cada uno.


    Este paquete destaca por ofrecer control total sobre el gráfico: tú decides cada elemento: ejes, colores, tipos de visualización, títulos, leyendas… todo se puede añadir y ajustar con capas. Esto hace que tus gráficos sean más personalizados e informativos.


    Los tres componentes principales de la gramática de grafos son:


  • Datos: las observaciones de nuestro conjunto de datos.
  • Estética: Asignaciones de datos a propiedades visuales (como ejes y tamaños de objetos geométricos).
  • Geometrías: Objetos geométricos, como líneas, que representan lo que vemos en el grafo.

  • Recursos útiles:


    PDF de la documentación: https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf


    Aquí está el enlace al sitio web: https://ggplot2.tidyverse.org/


    Y aquí está el enlace al libro: https://ggplot2-book.org/

    
    # Load the tidyverse package
    library(tidyverse)                    
                    
    
    # Load the msleep dataset
    data(msleep)
    
    # Check the structure of the msleep dataset
    str(msleep)                    
                    
    
    nrow(msleep)
    ncol(msleep)
    head(msleep)                    
                    
    
    # Are there NA values? How many?
    any(is.na(msleep))
    sum(is.na(msleep))                    
                    
    
    # Leave out any observation with NA values
    msleep %>%
      drop_na()
    
    #Equal to do:
    #drop_na(msleep)                    
                    
    
    # Is there a relationship between sleep total and sleep rem?
    # How can we check that?
    # Plotting maybe?
    
    plot(msleep$sleep_total, msleep$sleep_rem)                    
                    
    
    # Correlation coefficient can be computed using the functions cor()
    cor.test(msleep$sleep_total, msleep$sleep_rem, method = "pearson", use = "complete.obs")                    
                    
    
    #Comparing means
    t.test(msleep$sleep_total, msleep$sleep_rem)                    
                    

    Aplicación de ggplot2

    
    # Using tidyverse
    msleep %>%
      ggplot(aes(x = sleep_total, y = sleep_rem)) +
      geom_point()                    
                    
    
    #Directly calling ggplot
    ggplot(msleep, aes(x = sleep_total, y = sleep_rem)) +
      geom_point()                    
                    
    
    #Saving plots
    g <- ggplot(msleep, aes(x = sleep_total, y = sleep_rem)) +
      geom_point()
    ggsave(filename = "test.pdf", plot = g)                    
                    
    
    #Other alternative
    pdf("test2.pdf")
    g
    dev.off()                    
                    
    
    # Add a custom y-axis title
    msleep %>%
      ggplot(aes(sleep_total, sleep_rem)) + # Implicit or explicit arguments?
      geom_point() +
      xlab("Total sleep time (h)") +
      ylab("REM sleep time (h)")                    
                    
    
    msleep %>%
      ggplot(aes(sleep_total, sleep_rem)) +
      geom_point(color = "red") +  #visit: color-hex.com to select it
      xlab("Total sleep time (h)") +
      ylab("REM sleep time (h)")                    
                    
    
    # How can we colour the points by vore?
    str(msleep)                    
                    
    
    msleep %>%
      ggplot(aes(sleep_total, sleep_rem, color = vore)) +
      geom_point() +
      xlab("Total sleep time (h)") +
      ylab("REM sleep time (h)")                    
                    

    Boxplots

    
    # Base R
    boxplot(sleep_total ~ vore, data = msleep)                    
                    
    
    # ggplot2
    msleep %>%
      ggplot(aes(vore, sleep_total)) +
          geom_boxplot()                    
                    
    
    msleep %>%
      filter(!(is.na(msleep$vore))) %>%
      ggplot(aes(vore, sleep_total, fill = vore)) +
      geom_boxplot()                    
                    
    
    msleep %>%
      filter(!(is.na(msleep$vore))) %>%
      ggplot(aes(vore, sleep_total)) +
      geom_boxplot() +
      geom_jitter(aes(color=vore)) +
      labs(x= "Diet", y = "Total sleep time (h)", color ="Diet type")