2 Capítulo 2 — Instalar y configurar R
Epidemiología aplicada en acuicultura — Parte I: Fundamentos
Dónde encaja esto — Fundamentos. Configurar R es la base de todas las fases del marco (Anticipar → Prevenir → Detectar → Responder → Resguardar); las herramientas de aquí se usan en todas ellas.
2.1 Panorama
En el Capítulo 1 hicimos un pequeño cálculo a mano. Eso basta para tres números. Pero un centro de cultivo real genera miles de ellos —mortalidades semanales en decenas de jaulas, resultados de laboratorio, temperaturas, tratamientos— y una calculadora (o una planilla enorme con una fórmula que ya no recuerdas) deja de ser confiable. R es la forma de tomar el control de esos datos: es gratis, corre igual en cualquier computador y —lo más importante— deja un registro escrito de exactamente lo que hiciste, para que tu análisis pueda revisarse, corregirse y repetirse la próxima temporada.
Este capítulo te lleva desde cero hasta un entorno funcional, enseña lo justo de R para empezar y termina importando el conjunto de datos sobre el que se construye el resto del libro. Al final sabrás instalar y abrir R, entender las cuatro partes de la pantalla de RStudio, crear objetos y ejecutar funciones, cargar paquetes de la manera moderna, e importar y dar un primer vistazo a datos reales de cultivo.
Todo aquí usa un archivo, aquafarms_register.csv —una foto de salud de un mes de nuestras tres operaciones: Aysén Salmón S.A., Tilapia Lago Verde y Camarones del Golfo—. Lo conoceremos en detalle al final del capítulo.
No se asume experiencia previa en programación. Si nunca has escrito una línea de código, estás justo en el lugar correcto.
2.2 2.1 Preparación
2.2.1 Instala R y RStudio
Necesitas dos programas gratuitos, instalados en este orden:
- R — el motor que hace los cálculos. Descárgalo de la red CRAN, cran.r-project.org, eligiendo la versión de tu sistema operativo (Windows, macOS o Linux) y ejecutando el instalador con las opciones por defecto.
- RStudio Desktop — un banco de trabajo amigable que se apoya sobre R y lo hace mucho más cómodo. Descarga la versión gratuita de posit.co/download/rstudio-desktop e instálala.
Instala R primero y luego RStudio: RStudio busca R en tu computador al arrancar. De ahora en adelante abres RStudio (no R) cuando quieras trabajar.
2.2.2 Conoce RStudio — los cuatro paneles
Al abrir RStudio verás la pantalla dividida en paneles. Cuatro importan:
- Editor de código (Source) (arriba a la izquierda) — donde escribes y guardas tus scripts (archivos de código terminados en
.R). Aquí vive el trabajo real, porque un script es un registro que puedes volver a ejecutar. - Consola (abajo a la izquierda) — donde el código efectivamente corre e imprime resultados. Puedes escribir aquí directamente para cálculos rápidos y descartables.
- Entorno (Environment) (arriba a la derecha) — una lista de los objetos (datos, valores) que has creado en la sesión.
- Archivos / Gráficos / Ayuda (abajo a la derecha) — tus carpetas, los gráficos que hagas y las páginas de ayuda de R.
El hábito de oro: escribe código en el editor, no en la consola. Para ejecutar una línea desde el editor, pon el cursor en ella y presiona Ctrl + Enter (Windows) o Cmd + Enter (Mac).
2.2.3 Inicia un Proyecto de RStudio
Antes de escribir código, crea un Proyecto —una carpeta autocontenida para el libro—. En RStudio: File → New Project → New Directory → New Project, nómbralo algo como libro-epi-peces y elige dónde ponerlo.
¿Por qué molestarse? Porque un Proyecto fija tu directorio de trabajo —la carpeta que R trata como “aquí”—. Así puedes referirte a tu archivo de datos simplemente como data/aquafarms_register.csv en lugar de una ruta larga y frágil que se rompe apenas mueves la carpeta o la abres en otro computador. Esto lo hacemos robusto con el paquete here, más abajo.
2.2.4 La disposición de carpetas
Dentro de tu carpeta de proyecto, crea dos subcarpetas para mantener el orden:
libro-epi-peces/
├── libro-epi-peces.Rproj <- el archivo de Proyecto (ya creado)
├── data/ <- pon aquí aquafarms_register.csv
└── scripts/ <- pon aquí make_aquafarms_register.R
2.2.5 Carga el conjunto de paquetes del libro
R trae mucho incorporado, pero su verdadero poder está en los paquetes —complementos que otras personas han escrito—. Instalas un paquete una vez (se descarga de internet) y luego lo cargas en cada sesión en que quieras usarlo.
La mayoría de los libros te hacen escribir install.packages() y library() una y otra vez. Nosotros usaremos un enfoque más ordenado que sigue todo el libro: el paquete pacman y su función todo-en-uno p_load(), que instala un paquete si falta y luego lo carga. Instala pacman una vez:
install.packages("pacman") # córrelo una sola vezLuego, al inicio de cada script del libro, carga las herramientas que necesitas en una sola línea:
pacman::p_load(
rio, # importar y exportar datos de cualquier tipo
here, # construir rutas seguras desde la raíz del proyecto
tidyverse, # el kit central para manipular datos y graficar
janitor # limpiar datos y tablas resumen rápidas
)Estos cuatro son nuestra columna. Los capítulos posteriores agregan paquetes especializados, pero
rio,here,tidyverseyjanitoraparecen en casi todos.
2.3 2.2 Fundamentos de R en quince minutos
2.3.1 R como calculadora
5 + 3 # 8
2600 / 48 # 54.1667
sqrt(144) # 12Todo lo que va después de un # es un comentario — R lo ignora. Los comentarios son notas para tu yo del futuro; úsalos con generosidad.
2.3.2 Objetos y la flecha de asignación
El corazón de R es guardar un valor bajo un nombre para reutilizarlo. Lo haces con la flecha de asignación <- (atajo de teclado: Alt + -):
muestreados <- 48 # peces examinados en una jaula
positivos <- 8 # de esos, número positivo a SRS
prevalencia <- positivos / muestreados * 100
prevalencia # 16.666672.3.3 Vectores y tipos de datos
Un vector es una secuencia de valores del mismo tipo, construida con c() (“combinar”):
temps <- c(12.1, 13.6, 12.3, 12.3, 11.2) # temperatura del agua en cinco jaulas
mean(temps) # 12.3
max(temps) # 13.6
length(temps) # 5Los valores vienen en unos pocos tipos básicos: numérico (números), carácter (texto, siempre entre comillas), lógico (TRUE/FALSE) y factor (una categoría con niveles fijos).
2.3.4 Funciones
Una función toma entradas (sus argumentos, entre paréntesis) y devuelve un resultado. Ya usaste varias: mean(), sqrt(), c():
round(16.66667, digits = 1) # 16.7Si no estás seguro de qué hace una función, pregúntale a R: escribe ?mean y la ayuda se abre en el panel inferior derecho.
Cuando algo falla — los tres clásicos del principiante. (1)
could not find function "p_load"suele significar que un paquete no está cargado —corre tu líneapacman::p_load(...)—. (2)object 'prevalance' not foundes casi siempre un error de tipeo o un nombre que aún no creaste. (3) Un+en la consola en lugar de>significa que R espera que termines un comando incompleto —probablemente tienes un(o un"sin cerrar—. PresionaEscy reintenta.
2.4 2.3 Traer los datos del centro de cultivo
2.4.1 Importa el conjunto de datos
Con tu proyecto abierto y aquafarms_register.csv en data/, esta es toda la importación:
register <- import(here("data", "aquafarms_register.csv"))Dos ideas en una línea. here("data", "aquafarms_register.csv") construye la ruta correcta desde tu carpeta de proyecto, así funciona en cualquier computador. import() (de rio) lee el archivo —reconoce el .csv y decenas de formatos más automáticamente—.
2.4.2 Dale un primer vistazo
Nunca analices datos que no hayas mirado. Un puñado de funciones te dice qué tienes:
dim(register) # 24 12 -> 24 filas, 12 columnas
names(register) # los nombres de las columnas
head(register) # las primeras seis filasPara un resumen compacto y con tipos, glimpse() (del tidyverse) es la función a la mano:
glimpse(register)
#> Rows: 24
#> Columns: 12
#> $ farm <chr> "Aysen Salmon Co.", ...
#> $ species <chr> "Atlantic salmon", ...
#> $ water_temp_c <dbl> 12.1, 13.6, 12.3, 12.3, 11.2, ...
#> ...Y summary() da el rango y los promedios de cada columna a la vez —una forma rápida de detectar valores imposibles (un conteo negativo, un estanque a 90 °C) que delatan un error de digitación—.
2.4.3 Un primer resumen agrupado
Primero, una tabla de frecuencias de especies con tabyl() de janitor:
tabyl(register, species)
#> species n percent
#> Atlantic salmon 8 0.3333333
#> Nile tilapia 8 0.3333333
#> Whiteleg shrimp 8 0.3333333Segundo, la temperatura promedio por especie, nuestro primer contacto con la “tubería” (pipe, |>) del tidyverse, que se lee de izquierda a derecha como “toma los datos, luego agrúpalos, luego resúmelos”:
register |>
group_by(species) |>
summarise(mean_temp = mean(water_temp_c))
#> species mean_temp
#> Atlantic salmon 12.3
#> Nile tilapia 27.5
#> Whiteleg shrimp 29.62.5 2.4 Interpretación en el centro de cultivo
Esa última tabla ya cuenta una historia epidemiológica real. Las tres especies viven en mundos térmicos completamente distintos —salmón en torno a 12 °C, tilapia a 27,5 °C, camarón a casi 30 °C—. Guarda ese dato, porque la temperatura es uno de los motores más fuertes de enfermedad que veremos: gobierna cuándo estalla el Streptococcus en la tilapia, cuán rápido el AHPND colapsa un estanque de camarón y la estacionalidad del SRS en el salmón. La misma columna que parece un metadato aburrido es, en epidemiología, un brazo ambiental clave de la tríada del Capítulo 1.
Mira también n_stocked en tu salida de summary(): un estanque de camarón tiene cientos de miles de animales, mientras que una jaula de salmón tiene decenas de miles. Es un primer recordatorio de la lección del Capítulo 1 sobre los denominadores. Convertiremos estos conteos crudos en medidas de enfermedad comparables en el Capítulo 4.
2.6 2.5 Ejercicios
Inténtalo tú (2.1). En un script nuevo, carga el conjunto de paquetes, importa
registery correglimpse(). ¿Cuántas columnas son de tipo carácter y cuántas numéricas?
2.2 Crea un vector con las cinco temperaturas del salmón del capítulo y calcula su media y desviación estándar (sd()). Luego conviértelo a Fahrenheit.
2.3 Usando el registro, escribe una línea que haga un tabyl() de la columna system. ¿Qué sistema aparece más seguido, y por qué tiene sentido dadas las operaciones?
2.4 La prevalencia en una unidad es n_positive / n_sampled * 100. Elige una fila de head(register) y calcula su prevalencia.
2.5 Provoca un error a propósito: escribe mean(temp) cuando tu vector se llama temps. Lee el mensaje. ¿Qué te dice R y cómo lo arreglas?
2.7 Resumen y qué sigue
- Instalaste R (el motor) y RStudio (el banco de trabajo), en ese orden.
- Aprendiste los cuatro paneles y el hábito de escribir código en scripts, no en la consola.
- Un Proyecto de RStudio más el paquete
herehacen las rutas robustas entre computadores. - Cargas herramientas en una línea con
pacman::p_load(...); nuestra columna esrio,here,tidyverse,janitor. - Conociste los bloques de R —objetos (
<-), vectores (c()), tipos y funciones— y los tres errores clásicos. - Importaste el conjunto de datos del libro con
import(here(...))y lo inspeccionaste condim(),glimpse(),summary()ytabyl().
En el Capítulo 3 — Describir lo que ves, usamos este mismo registro para aprender la estadística descriptiva en la que realmente se apoya un especialista en salud de peces.
Archivos de este capítulo: data/aquafarms_register.csv (el conjunto de datos) y scripts/make_aquafarms_register.R (el generador con semilla).