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.
Al comenzar con R (o cualquier lenguaje de programación), aprendemos tres habilidades fundamentales:
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.
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.
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:
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.
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.
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
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
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 = " "))
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
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
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.
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)
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)
Los packages son conjuntos de funciones predefinidas que te ayudan a realizar tareas específicas. Por ejemplo:
# 1. Instalar (solo una vez):
install.packages("ggplot2")
# 2. Cargar (cada vez que lo uses):
library(ggplot2)
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))
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)
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:
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)
# 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)")
# 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")