diez <- 5+5
print(diez)[1] 10
Taller de IA y CD
Maciel-Cruz, EJ
June 12, 2025
Programación
La programación se puede definir como un conjunto de instrucciones para crear una función o programa. Básicamente, es decirle a la computadora, mediante un lenguaje específico, que realice una tarea. La programación puede ser tan básica como lo siguiente:
En el código previo, se generó una variable (“diez”), que tiene como función generar la operación aritmética de “5+5”, lo que da como resultado “10”, para corroborarlo, se utilizó la función “print”, lo que arroja el resultado de la función guardada en el objeto “diez”.
Sin embargo, la programación puede ser tan compleja que requiere varias líneas de código para obtener resultados específicos, como el caso de algunos gráficos muy personalizados, o el Machine Learning.
GUI
Una interfaz gráfica de usuario (GUI, por sus siglas en inglés) es un entorno visual que permite a las personas interactuar con un programa de manera sencilla y amigable, utilizando elementos gráficos como ventanas, iconos y menús. Este tipo de interfaz facilita el uso de computadoras y dispositivos, ya que no requiere recordar comandos de texto, y es la forma en que la mayoría de los usuarios interactúan con sistemas operativos como Windows, macOS o aplicaciones como R Studio.
Precisamente, la interfaz de R Studio es una GUI.

De hecho, utilizo una GUI (R Studio y VSCode), para generar el curso y poder publicarlo en línea. La parte inferior, que dice “Terminal”, es lo que habitualmente usamos en Linux para introducir comandos.
Bases de datos
Una base de datos es un conjunto de información organizada de manera estructurada, que permite almacenar, consultar y analizar datos de forma eficiente. En otras palabras, es una colección de datos relacionados que pueden ser revisados, filtrados o utilizados para realizar análisis y generar reportes o gráficos, dándole un sentido específico para resolver algún problema.

En la imagen anterior, observamos una base de datos clásica, ordenada y estructurada, las que trabajamos a diario en una GUI llamada Excel.

Lo que vemos aquí como un bloque de texto es la misma base de datos, pero en un formato diferente de separación. Este formato permite ahorrar espacio de almacenamiento y facilita su exportación. La base de datos está guardada en un archivo de texto plano y la estamos visualizando con un editor de texto, que también es una GUI.

El formato de archivo Markdown es un lenguaje de marcado ligero que permite crear documentos de texto plano con formato. Es ampliamente utilizado para escribir documentación, notas, blogs y otros tipos de contenido en línea. Markdown utiliza una sintaxis sencilla y fácil de leer, lo que lo hace accesible para usuarios sin experiencia en programación. Lo usaremos durante el taller para crear los documentos y el proyecto final.
Las principales códigos de formato en Markdown incluyen:
# Encabezado 1, ## Encabezado 2, etc.Énfasis: Se utiliza asteriscos (*) o guiones bajos (_) para aplicar énfasis al texto. Por ejemplo, *texto en cursiva* o **texto en negrita**.
Listas: Se crean utilizando guiones (-) o asteriscos (*) para listas no ordenadas, y números seguidos de un punto (1.) para listas ordenadas. Por ejemplo:
Enlaces: Se crean utilizando corchetes para el texto del enlace y paréntesis para la URL. Por ejemplo, texto del enlace.
Esos son los más frecuentes, pero dejo una imagen para que vean otros altamente utilizados:

Enlace directo a la imagen en la web:
Un inconveniente al que nos enfrentamos en R a diferencia de cómo lo hacemos de forma habitual en nuestros archivos de la computadora es el nombramiento de archivos. De forma general, existen las siguientes recomendaciones para R, y su por qué:
objeto 1 <- “Objeto 1”
Si intentamos correr el texto anterior en nuestro entorno de R, nos arrojaría un error, ya que lo considera como objetos separados, pero si lo hacemos de la siguiente forma:
No se producen errores y se crea el objeto en nuestro ambiente.
Puedes usar guión bajo, puntos, texto junto, etc., el objetivo es no tener espacios.
library(“readr”) base <- read_csv(“~/EJMC/Trabajo/base de datos de prueba.xlsx”)
El código anterior, todo lo que se encuentra entrecomillado, es la dirección relativa de la base de datos que quiero asignar al objeto llamado base, por lo que le estoy diciendo a mi computadora que, textualmente, busque todo ese segmento de información, porque no está separado.
CSV
Los archivos .csv son archivos separados por comas (Comma Separated Values), que es un formato especial de documento que permite almacenar grandes cantidades de información en espacios reducidos (pocos megas en comparación con otros formatos como .xlsx), conservando toda su estructura. La desventaja es que es texto plano, es decir, no tiene negritas, cursivas, colores, tamaños de letra ni nada por el estilo. La ventaja, es que se puede manejar cientos de miles datos fácilmente sin que nuestra computadora termine congelada, dependiendo de la computadora, por supuesto.
El lenguaje R habitualmente maneja este formato de archivos, ya sea separado por comas, tabuladores o algún otro símbolo en especial; sin embargo, también acepta otros formatos, como los de Excel, pero hay que considerar que al momento de importar, se pierde toda la estructura de formato, es decir, colores, tamaños, negritas, cursivas, etc. Por lo que se recomienda habituarse al .csv para fines de ciencia de datos.
TSV
El .tsv es similar al formato previo, pero aquí está separado por tabulador, la tecla mencionada previamente. Tiene las mismas ventajas y desventajas que .csv, el por qué usar uno de otro depende de la base de datos en cuestión, si alguna observación cuenta con comas (digamos, 1,234.56), no es recomendable usar .csv., por lo que si se usa .csv, R modificaría la base de datos y no se podría analizar correctamente.
XLSX
Este es el formato de excel por excelencia, tiene la característica de que podemos personalizar el tipo de letra, tamaño, colores, etc., pero al cargar a R, este formato se pierde. Para fines de ciencia de datos, se recomienda NUNCA JAMÁS DE LOS JAMASES EN EL PAÍS DEL NUNCA JAMÁS (Atentamente: Peter Pan) utilizar colores para dividir información, al menos si piensas hacer análisis con R.
TXT
Esto es un archivo de texto plano, es el que se guarda en el bloc de notas, y que se puede abrir con cualquier aplicación similar en cualquier sistema operativo. De hecho, se pueden modificar las extensiones de los .csv y .tsv a .txt y se pueden visualizar de igual forma, siempre y cuando se mantenga la estructura de los separadores.
El formato .csv es muy flexible, realmente puedes poner separadores como tabular, comas, punto y coma, en R hay una opción para elegir el tipo de separador de dato.
Tipos de datos
En R, se manejan algunos tipos de datos un poco diferentes a lo habitual en estadística, esto con el objeto de hacer operaciones y para ahorrar costos computacionales.
Numérico
Es un tipo de dato que contiene número decimales, cualquier número que tenga un punto decimal, debe ser de este tipo.
Hagamos un ejemplo, y creemos los siguientes objetos:
Lo anterior, deberá haber creado los objetos “n1”, “n2”, y “n3”, los cuáles contienen los números ingresados.
Además, notarás que existe una “c” previo a la apertura de un paréntesis, esa es la función de combinar o concatenar, es decir, que una serie de datos separados por coma se van a asignar a ese objeto, puede asignar tantos datos como desees.
En “R” el separador de los datos, ya sea de números o caracteres a combinar, es la coma. Esto también va para separar funciones y argumentos.
Para verificar el contenido, recordemos la función “print”. De igual forma, podemos solo introducir el objeto y oprimir “Ctrl + Enter”, lo que arrojaría el resultado en la consola.
La función “class” nos dice el tipo de clase a la que pertenece algún objeto creado, hagamos el ejemplo:
Debería de decir “numeric” en la consola, para cada objeto creado.
Muchas veces encontrarás un formato llamado “double”, que para fines prácticos del taller es lo mismo que “numeric”.
Entero
Es un tipo de dato que contiene números enteros, cualquier número que NO tenga punto decimal, debe de ser de este tipo. Ahora, generemos nuevos objetos, unos de tipo entero, los que desees.
Ahora, notarás que la clase no se ha modificado desde el primer tipo de dato, es decir, todo nos dice “numeric”, debido a que R almacena cualquier valor numérico en esa clase, tenga o no decimales. El cambio de tipo de dato es útil para algunas funciones, como la notación decimal.
Carácter: es cualquier tipo de cadena de texto. Se incluyen símbolos.
En el ejemplo anterior, creamos tres objetos, “animales_1”, “números_1” y “números_2”. Notarás que unas cadenas de datos contienen comillas, y otras no. Una vez que hayas creado cada uno de los objetos, verifica las clases. Las comillas, para el caso de los números, nos permiten forzar la conversión a carácter. Esto es necesario si los números ingresados corresponde a valores no numéricos, o definiciones previas.
Complejo: es cualquier tipo de combinación numérica y una parte imaginaria.
Los tipos de datos complejos se componen de un parte numérica y una imaginaria, que en este caso es el “i”, es poco utilizado en ciencias biológicas. De hecho, no se verá en este curso.
Lógico: Es cualquier tipo de operador que entrega dos resultados. Puede ser True o False, 1 y 0, Verdadero o Falso, etc. Se puede asignar y modificar.
En el objeto “lógico_1”, se genera automáticamente utilizando las iniciales de F o T, pero también se pueden usar las palabras completas en mayúsculas. En el caso de “lógico_2”, nótese que utilizamos la función “as.logical”, lo que hace es forzar la conversión de valores numéricos a lógicos.
Además, nótese que “R” es sensible a los acentos, por lo que ese acento en la “o”, es un objeto diferente. Incluso el objeto “Lógico_1”, contiene valores que van del cero al cuatro, se puede forzar la conversión, pero cualquier valor diferente de “0”, se considera como TRUE.
Factores: Realmente no es un tipo de dato de forma específica, sin embargo, presenta una enorme utilidad en el ambiente. En este “tipo de dato”, nos permite categorizar en orden personalizado variables categóricas. Por ejemplo, “bueno”, “regular”, y “malo”. De entrada, se manejaría como carácter, pero podemos modificarlo para que sea factor, es decir, categórico.
Por último, nótese que utilizamos la función “as.factor”, lo que hace forzar la conversión a este tipo de dato. Es importante mencionar que el orden predeterminado es alfanumérico, lo que puede producir problemas de análisis si convertimos a factor una columna sin este método, pero existen varias herramientas para reordernarlos, que se verán más adelante.
Para fines prácticos del taller, solo nos enfocaremos en “double”, “logical”, “factor”, “character”.
Estructuras de datos
Los datos pueden presentar diferentes estructuras, dependiendo si son lineales, o bidimensionales, si contienen un solo tipo de dato (atómicos), o si contienen diferentes tipos.
Vectores:
Es la estructura de datos más simple en R, consiste en un conjunto lineal de información de un solo tipo, es decir, solo numérico, o solo carácter, no se debe combinar para que siga siendo un vector.
La función de los vectores es que se pueden aprovechar para realizar la misma operación con el conjunto de los datos.
Los anteriores son vectores numéricos, pero también se pueden hacer con datos de tipo carácter. Con los vectores, se pueden hacer diferentes operaciones matemáticas simultáneas, lo que facilita la generación de datos o nuevas variables.
Hagamos algunas operaciones con los vectores 1 a 3.
Ahora, obtengamos el imc con la fórmula básica de peso/altura^2.
Recordemos el orden de las operaciones en aritmética, estos también se respeta en R. Si imprimimos el resultado, nos debe arrojar el imc para cada dato.
Así mismo, podemos crear un objeto que pase los resultados calculados, esto se logra al crear un objeto, usar el operador de asignación, y crear la aritmética.
Lo anterior nos va a crear un nuevo vector llamado “imc” con el resultado asignado, que es dividir el peso sobre la altura al cuadrado, que es la fórmula del índice de masa corporal. Podemos crear diferentes objetos mediante este formato, es decir, aplicar alguna fórmula, método, conversión, entre otros a algún vector.
Ahora, vamos a crear los siguientes vectores de tipo carácter:
El código anterior genera dos vectores diferentes, uno con nombres, y otro con apellidos, en este caso no tendría sentido realizar operaciones aritméticas, incluso no arroja un error. Pero si podemos realizar procesos como juntar ambos vectores para obtener el nombre y apellido, similar a la función de concatenar en Excel.
Los vectores deben tener la misma longitud si queremos datos empatados, es decir, observación 1 con observación 2. Si no hubiera congruencia de datos, lo que hace R es reciclar los vectores, o sea, reiniciar el conteo.
Primero vamos a juntar ambos vectores, para eso usamos la función “paste”
En el código anterior creamos un vector llamado “nombres”, este vector contiene la unión de v4 con v5, en ese orden, para generar un nuevo vector. Por defecto, se utiliza el separador de espacio, si quisiéramos utilizar otro separador, tenemos un argumento llamado “sep”, para que elijamos el símbolo que queramos.
En R, un argumento es una opción que modifica la función que estamos utilizando, es decir, podemos hacer unos pequeños ajustes para se comporte como necesitamos. En este caso, “sep” es indicativo de “separate”, es decir, el símbolo que separa la unión de un vector de otro.
Matrices
Es una estructura de datos de dos dimensiones (los vectores son tenían una, lo que los hace lineales), por lo que tiene columnas en eje de las y (horizontales), y filas en el eje de las x (verticales).
La clave es que la matriz se puede crear a partir de las filas y columnas indicadas, o se puede transformar acorde a esa razón. Por ejemplo, una matriz de 4 x 3 tendrá cuatro filas y tres columnas, una de 8 x 10, tendrá 8 filas y 10 columnas.
Siempre se cuentan primero las filas, o el eje de las x. Las matrices son especialmente útiles para los datos numéricos, ya que nos permiten hacer transformaciones (aritmética, normalización, estandarización, etc.), reduciendo recursos computacionales.
Vamos a crear la siguiente matriz numérica.
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 6 11 16 21 26 31 36 41 46
[2,] 2 7 12 17 22 27 32 37 42 47
[3,] 3 8 13 18 23 28 33 38 43 48
[4,] 4 9 14 19 24 29 34 39 44 49
[5,] 5 10 15 20 25 30 35 40 45 50
En el código anterior creamos primeramente un vector llamado “m1”, al que le asignamos un serie de números que van del 1 al 50 (los dos puntos significan que queremos que siga el orden lógico numérico de un inicio a un fin).
Con el objeto creado, vamos a asignarle la dimensión con la función “dim”, y le decimos que sea de 5 x 10, es decir, 5 filas de 10 columnas. Con lo anterior, los números del 1 al 50, se transformarán y se van a reordenar en ese formato, el 1 al 5 en la primera columna, del 6 al 10 en la segunda, y así sucesivamente.
Si las dimensiones solicitadas no son múltiplo de la cantidad de datos, es decir, si pidiéramos 5 filas con 9 columnas, nos arroja error y nos dice que no coincide la longitud y no se puede crear. Es un método a prueba de error para no perder datos.
La utilidad de las matrices consiste en realizar transformaciones numéricas en nuestras bases de datos, la regla habitual es extraer la matriz de datos en un nuevo objeto, hacer las transformaciones, y llevar a cabo nuestros análisis. La otra opción es introducir la nueva base a la base previa, o reemplazar los valores, como se desee.
Hagamos ejercicios de matrices, creemos dos matrices numéricas, la primera que sea del 1 al 100, en una matrix de 10 x 10; la segunda que sea del 1 al 30, en una matrix de 5 x 6.
DataFrame
Son estructuras de datos de dos dimensiones, pero a diferencia de las matrices, los data frame permiten utilizar datos mixtos (combinación de numéricos, lógicos, carácter…), la única condición es que los vectores deben de tener la misma longitud si se crean con R, en caso de que se importen, los datos ausentes se manejan de diferentes formas que se verán más adelante.
De hecho, el data frame, es el tipo de estructura de datos más utilizada en R, y en otros ambientes, nosotros prácticamente solo usamos data frames al trabajar con Excel en el área de ciencias de la salud.
Vamos a crear un data frame (df), de cero.
nombre <- c("Luis", "Pedro", "María", "Gloria")
apellido <- c("Gómez", "Fernández", "Cruz", "Pérez")
edad <- c(30,50,23,30)
sobrepeso <- as.logical(c(1,1,0,0))
sexo <- c("Masc","Masc","Fem","Fem")
DM <- c("1","2","0","3")
df1 <- data.frame(nombre, apellido, edad, sobrepeso, sexo, DM)
df1 nombre apellido edad sobrepeso sexo DM
1 Luis Gómez 30 TRUE Masc 1
2 Pedro Fernández 50 TRUE Masc 2
3 María Cruz 23 FALSE Fem 0
4 Gloria Pérez 30 FALSE Fem 3
Con el código anterior, primero creamos seis vectores que contienen la información de interés, de tipos de datos mixtos, luego, los agregamos todos a un df llamado “df1”, si lo imprimimos, tendremos una base de datos con la información. Además, si observamos en nuestro ambiente, nos refiere el tipo de estructura de dato, que para “df1, es un”data.frame”.
Para fines prácticos en ciencias biológicas, casi siempre utilizamos dataframes, su abreviatura usual es “df”.
R se divide en cuatro en la interfaz de usuario, esto es útil ya que se puede visualizar todo lo que se requiere y está accesible de forma rápida.
La ventaja de trabajar por proyectos es que al momento de importar y exportar archivos, es más fácil, y se pueden visualizar en nuestro panel de salida. Otra ventaja de trabajar por proyecto, es que se guarda nuestras librerías cargadas, ambiente, bases cargadas, etc. Lo anterior permite que no mezclemos datos o información de un proyecto a otro, y que no corramos el riesgo de borrar algo que no queríamos.