Curso R Biociencias: Sesión 2. Empezando a trabajar con datos

En la clase de hoy terminaremos de ver las bases de R, solo nos falto ver a detalle cómo utilizar funciones y sus argumentos. Después repasaremos los mensajes mas importantes de la tarea (la lectura de R style guide). Para empezar a trabajar con datos, iremos desde lo mas sencillo que es hacer operaciones con datos, recordaremos como crear vectores y data frames, y aprenderemos a referirnos a partes especificas de nuestros datos para usarlas en los análisis.

Recordando la sesión anterior

  • Vimos que R nos ofrece una manera de analizar datos usando lenguaje de programación.
  • Usar R no es tan difícil como pudiera parecer, y puede ser más sencillo y rápido que usando software gráfico.
  • El software R básico es solo una consola a la que se le dan ordenes por medio de código. Rstudio nos brinda algunas facilidades para interactuar con esa consola.
  • R maneja 3 tipos de información principales (aunque hay algunas otras más): números, texto (o también llamado carácter), y lógico (TRUE o FALSE). Texto siempre va entre comillas y el lógico no.
  • R puede organizar esta información en varios tipos de estructuras básicas: escalar, vector, data frame, matriz y lista.
  • Escalares se crean simplemente asignando valores a los objetos, vectores se pueden crear con la función c(), data frames con la función data.frame(), matrices con matrix() y listas con list().

Funciones y argumentos

Las funciones y sus argumentos son de los protagonistas que hacen la magia de R. Estas nos permiten realizar diferentes análisis y procesos a nuestros datos y objetos en general. Las funciones y sus argumentos siempre se escriben de la siguiente manera:

nombreDeLaFuncion(argumento1 = respuesta1, argumento2 = respuesta2, argumento3 = respuesta3, …)

Así las funciones siempre van seguidas de paréntesis que contienen los argumentos, y cada argumento necesita forzosamente llevar una respuesta. Los diferentes argumentos con su respuesta debe estar separados por una coma. La respuesta de los argumentos puede ser cualquier tipo de información (numero, texto o carácter, o lógico) en cualquier tipo de estructura (escalar, vector, matriz, data frame o lista), según lo que requiera cada argumento en especifico.

Me imagino que en tu mente ronda una pregunta o dos… para empezar, ¿cómo saber que argumentos debe contener una función determinada?, y ¿cómo saber que respuesta espera un argumento determinado?. Eso lo veremos en el siguiente apartado.

Usando la ayuda de R

La ayuda de R nos puede ayudar a contestar esas preguntas. La ayuda para funciones de R se puede invocar de varias maneras y puedes usar la que se te haga mas fácil:

  • En la consola (o pudiera ser también en el script, pero no tiene mucho caso) usando ?nombreDeLaFuncion. Por ejemplo, ?mean para buscar la ayuda para la función mean().
  • También en la consola usando la función help(). Por ejemplo, help(mean) para buscar la ayuda de la función mean().
  • O en la parte de Rstudio específica para la ayuda, en el cuadro de búsqueda mas superior de esa parte.

La ayuda de las funciones siempre tiene el mismo formato general, prueba buscando la ayuda de plot() o mean() (función para calcular la media de unos datos):

  • Nombre de la función y a qué paquete (grupo o librería de funciones) pertenece. Por ejemplo, mean{base}, que significa que la función mean pertenece al paquete base.
  • Nombre largo de la función en lenguaje humano. Por ejemplo, Arithmetic Mean.
  • Descripción: Descripción de la función.
  • Usage: Muestra la(s) manera(s) de usarse de la función con sus argumentos. Un dato curioso es que para algunos argumentos provee respuesta y de otros no. Esto indica que los argumentos que no tienen respuesta son los argumentos en que nosotros mismos tenemos que proveerla manualmente. Los argumentos que tienen respuesta indican el valor default de la respuesta, es decir, que si no escribimos esos argumentos al momento de usar la función en nuestro código R usará sus valores default. Por ejemplo, a mean() se le debe de proveer la respuesta al argumento x para que funcione, pero el valor por default del argumento trim es 0 y el de na.rm es FALSE. Si no deseamos usar la opción por default de estos últimos dos argumentos podemos proveer manualmente la respuesta deseada.
  • Arguments: Menciona los argumentos de la función, su descripción en y el tipo de respuesta que debemos proveerle. Por ejemplo, en la función mean(), el argumento x serán los valores a los que se le sacara la media y debe ser un vector numérico o de fecha.
  • Details: Da detalles o clarifica algunos puntos acerca de la función o alguno de sus argumentos y las respuestas de los argumentos.
  • Value: Indica el resultado que obtendremos al aplicar dicha función. Por lo general es lo que nos mostrará en pantalla o lo que se guardara en el objeto al que le asignemos dicha función. Por ejemplo, la función mean devolverá solo el valor de la media aritmética de los datos indicados en el argumento x.
  • Referencias: Referencias bibliográficas relacionadas al funcionamiento de la función.
  • See also: Otras funciones relacionadas.
  • Examples: Ejemplos del uso de la función. Por lo general estos ejemplos generan primero unos datos y luego aplican la función sobre esos datos.

La tarea de la sesión pasada: Guia para hacer códigos en R

Antes de empezar a trabajar con los datos dejemos claro algunas de las aspectos mínimos sobre cómo deberíamos hacer nuestros códigos para R. La idea de esto es hacer nuestros códigos sean legibles, comprensibles y compartibles. Para efectos de este curso al menos siempre tratemos de:

  • Usar nombres explícitos y descriptivos para archivos (los archivos de scripts o códigos de R) y para los objetos. Siempre.
  • Usar mayúsculas o puntos para separar palabras dentro de los nombres de objetos. Por ejemplo, promedioTemperaturas o promedio.temperaturas
  • Usar espacios después de las comas y entre signos y operadores (<-, =, <, >, +, — , /, etc).
  • Iniciar siempre los códigos con una descripción de lo que hace el código en comentarios (hacer comentarios usando el signo #), y hacer comentarios en todas las partes del código. Esto facilitará que le entendamos rápido al código la próxima vez que lo veamos.

Primero una pequeña práctica para recordar

Antes de continuar práctica como crear un escalar, un vector, una matriz, un data frame y una lista. Si no lo recuerdas, ve a la sesión anterior o consulta los recordatorios al principio de esta sesión para ver con que función se hacen estos diferentes objetos.

Haciendo operaciones con los datos

R puede hacer operaciones matemáticas con nuestros datos, tal como si fuera algo muy parecido a una calculadora científica. Prueba realizando sumas (usando signo +), restas (-), multiplicaciones (*), divisiones(/), usando paréntesis, etc., en algunos números.

# Por ejemplo
2 + 2
3 – 2
2 * 3
10 / 2
2 + (2 * 3)

Prueba corriendo una operación con parentesis, pero no cierres el parentesis… aver que pasa.

# Por ejemplo
2 + (2 * 3

¿Qué paso?. R nos puso un signo de “+” en la consola. Lo que significa es que R se dio cuenta que introducimos una orden incompleta y espera que la completes. Inserta ) para que realice la operación. Esto mismo ocurrirá cuando no cerremos corchetes [] o comillas “”.

Los resultados de las operaciones se pueden guardar en objetos y usarse después en otras operaciones. Intenta guardando un numero en un objeto. Luego úsalo en otra operación y guarda el resultado en otro objeto.

# Por ejemplo
a <- 2
b <- a + 3
c <- a * b

# Recuerda correr el nombre del objeto en la consola para verificar su contenido y que todo salio bien.

Hagamos ahora unas operaciones con vectores. ¿Qué pasa si un vector lo multiplicamos por un escalar? ¿Qué pasa si el vector lo sumamos con otro vector?

# Creamos primero un vector, recuerda que esto se puede hacer con la funcion c()
vectorDePrueba <- c(2, 3, 5, 7)

# Multipliquemos este vector por 2 y guardemos el resultado en un nuevo objeto
resultado <- vectorDePrueba * 2

# Creamos un segundo vector, el cual lo sumaremos al vector vectorDePrueba que ya habíamos hecho
segundoVector <- c(3, 4, 5, 6)
sumaVectores <- vectorDePrueba + segundoVector

# Recuerda correr los nombres de los objetos en la consola para verificar su contenido y que todo salio bien.

Me imagino que notaste que ocurrió. Cuando hacemos una operación aritmética de un vector por un escalar, R hace esa operación para cada elemento del vector con el escalar, resultando en un nuevo vector. Cuando hacemos una operación entre dos vectores, R hace esa operación elemento por elemento de los vectores (en el ejemplo R sumo el primer elemento de un vector con el primer elemento del otro vector, y así sucesivamente).

Importando datos a R

Lo mas común para trabajar con datos en R es importar una tabla de datos que ya tenemos hecha y hacer el código para analizar estos datos en R. Una de las maneras mas comunes de importar tablas en R es importando archivos tipo csv (siglas en ingles para “coma separated values”/”valores separados por coma”. Cualquier software de hoja de calculo (Excel, LibreOffice, etc.) puede crear estos archivos. R puede crear data frames a partir de estos archivos.

Para preparar una tabla de datos csv abrimos nuestro sofware de hoja de calculo y hacemos una tabla de datos como normalmente lo haríamos. Lo ideal es: 1) empezar la tabla en la fila 1 y columna A, 2) que la primera fila contenga los nombres de las variables de la tabla, 3) de la segunda fila para abajo deben de ser solo datos.

Prepara de esa manera una tabla de datos, puede ser inventada o una que ya tengas. Esta la importaremos a R mas adelante. Trata de que la tabla tenga al menos unas 10 filas de datos, y que sean al menos 3 variables, y que al menos una de estas variables sea de tipo texto/carácter o lógico. De preferencia trata de incluir valores faltantes en la tabla, es decir, valores que por algún motivo no existen. Los valores faltantes en R se indican con el valor NA, así que puedes poner NA en algunas celdas de tu tabla.

Tabla de datos meteorologicos. La guarde con nombre datosMeteorologicos.csv

Cuando esté lista, guárdala, y al momento de guardarla escoge que sea en formato csv. Si en tu software de hoja de calculo te salen varios tipos de formato csv usa el que esté mas arriba en la lista de opciones, que normalmente son los mas comúnmente usados. Al hacer esto en realidad has creado un archivo de texto que contiene tu tabla de datos, y los diferentes valores de cada celda están separados por una coma. Prueba abriendo este archivo en un editor de texto (por ejemplo Block de notas de Windows, TextEdit en Mac) y obsérvalo. Si por casualidad en vez de estar separados por coma están separados por otra cosa, como punto y coma, anótalo en tu mente y al rato usaremos esa información.

Para importar este archivo en R usaremos la función read.csv(). Tomate un momento para ver la ayuda de esta función y saber que argumentos debe tener y su respuesta. Presta especial atención a la sección Usage y a los argumentos señalados para read.csv() de la sección Arguments.

Vamos a importarlo. Primero debemos definir nuestro directorio de trabajo. Siempre en R debemos usar un directorio de trabajo, es decir, una carpeta de la computadora donde almacenemos los archivos que usaremos. Crea una carpeta en tu computadora y deposita ahí tu archivo csv. Hay dos maneras de seleccionar el directorio de trabajo: 1) en Rstudiove al menú Session -> Set Working Directory -> Choose Directory, 2) con la funcion setwd(). Te recomiendo que uses la primera y busca tu carpeta de trabajo y selecciónala. Ahora si ya estamos listos para usar la función read.csv() y guardar su resultado en un objeto. Como la tabla que yo hice es de datos meteorológicos en varias estaciones, yo le pondré a mi objeto datosMet. Tu puedes ponerle como gustes.

# La funcion read.csv() ya tiene varios defaults, como se ven en la ayuda. Funcionara solo usando el argumento file.
datosMet <- read.csv(file = “datosMeteorologicos.csv”)

# Si por alguna razon te diste cuenta que tu archivo csv separaba diferente los valores (p ej con una coma) debemos ayudarnos con el argumento sep para indicarle el caracter que separa los valores.
datosMet <- read.csv(file = “datosMeteorologicos.csv”, sep = “;”)

#Si todo salio bien, al correr el nombre del objeto en la consola debe desplegar un data frame con la tabla de manera maravillosa

Usar algunas funciones en nuestros datos

Antes de usar funciones en nuestros datos, probaremos usándolas en un vector. Las funciones que probaremos serán mean() para obtener el valor de la media de unos datos, min() para obtener el valor mínimo, y max() para obtener el valor máximo. Tomate un momento para revisar la ayuda de estas funciones y determinar que argumentos y que respuestas debemos incluir en ellas. Vamos a probar aplicando mean() en uno de los vectores que ya habíamos creado más arriba en esta sesión.

# Recuerda que puedes poner el nombre que desees a los objetos. Trata de que sean descriptivos
promVector <- mean(vectorDePrueba)

# ¿Que contiene el nuevo objeto que acabamos de crear?

Para aplicar estas funciones en un data frame se hace de manera diferente porque un data frame esta compuesto de varios vectores. Entonces debemos solo realizarlo sobre uno de los vectores o variables del data frame. Para seleccionar el vector o la variable deseada usa el símbolo $ después del nombre del objeto. En Rstudio, al usar el botón de tabulador del teclado te dirá las opciones posibles.

# Obtendre el promedio de temperaturas anuales de mi tabla
tempProm <- mean(x = datosMet$temperaturaAnual)

# En caso de que la variable contenga datos faltantes (NA) debemos usar el argumento na.rm
tempProm <- mean(x = datosMet$temperaturaAnual, na.rm = TRUE)

Seleccionando datos específicos

En vectores, data frames, matrices y listas podemos seleccionar datos específicos para nuestros análisis usando corchetes [] después del nombre del objeto. Dentro de los corchetes incluiremos instrucciones para incluir la localización de los datos que nos interesan. También podemos incluir una condición, así solo estaremos seleccionando a los datos que cumplan con una condición.

En vectores, al ser objetos de una sola dimensión, podemos solo incluir el numero que representa la posición en que se localizan los elementos que nos interesan. Un ejemplo usando los vectores creados con anterioridad.

# Referirnos al tercer elemento del vector
vectorDePrueba[3]

# Referirnos del segundo al cuarto elemento
vectorDePrueba[2:4]

En data frames, al ser objetos de dos dimensiones (fila y columna) debemos incluir dos números de localización, primero la fila y luego la columna. Probando esto en la tabla que creé e importé.

# Referirnos al elemento de la fila 2 columna 3
datosMet[2, 3]

#Referirnos a las filas 2 a 5 de las columnas 3 a 4
datosMet[2:5, 3:4]

Si nos quisiéramos referir a todas las filas de determinadas columnas solo debemos quitar el numero de fila manteniendo la coma. Y viceversa, si quisiéramos tener todas las columnas para las filas seleccionadas.

# Referirnos a todas las filas de la columna 3
datosMet[, 3]

# Referirnos a todas las filas de las columnas 3 a 4
datosMet[, 3:4]

# Referirnos a la fila 2 con todas sus columnas
datosMet[2, ]

# Referirnos a las filas 2 a 5 con todas sus columnas
datosMet[2:5, ]

Para seleccionar solo a los datos que cumplan con determinadas condiciones se usan operadores lógicos para indicar la condición. Revisa los operadores lógicos que se pueden usar en R en https://www.statmethods.net/management/operators.html . Por ejemplo, seleccionemos las filas de un data frame que cumplan una determinada condición y todas las columnas.

# Referirnos solo a las filas que sean de la localidad de Hermosillo de mi tabla de datos meteorologicos
datosMet[datosMet$localidad == “Hermosillo”, ]

En lenguaje humano, la condición que usamos dice: del objeto datosMet selecciona solo las filas en las que el valor de la variable localidad de ese mismo objeto (datosMet$localidad) sea igual (==) a Hermosillo (“Hermosillo”), y todas las columnas.

Prueba usando otras condiciones, por ejemplo seleccionando solo las filas con temperatura anual mayor a 28, seleccionando solo las filas con lluvia menor o igual a 300, o las localidades que no sean Hermosillo.

Si quisieras agregar otra condición, prueba usando los operadores lógicos | ó & para separar una condición de otra.

# Referirnos solo a las filas que sean de la localidad de Obregon y que la lluvia sea mayor o igual a 300 y todas las columnas.
datosMet[datosMet$localidad == “Obregon” & datosMet$lluviaAnual >= 300, ]

Tambien se pueden seleccionar datos especificos de un vector del data frame que cumpla con determinadas condiciones, lo cual es muy similar a lo anterior pero ya no tendriamos que usar la coma dentro del corchete, porque nos estamos refiriendo a un vector.

# Referirnos a las temperatura de las localidades de Hermosillo
datosMet$temperaturaAnual[datosMet$localidad == “Hermosillo”]

# O alternativamente pudiéramos haber hecho
datosMet[datosMet$localidad == “Hermosillo”, 3]

Aplicando funciones a datos específicos

Ya que sabemos como seleccionar datos específicos de un data frame, podemos aplicar funciones a estos datos específicos. Por ejemplo, aún usando mi tabla de datos meteorológicos, obtener el promedio de temperaturas anuales de la ciudad de Hermosillo:

# Guardaremos el resultado en el objeto promTempHillo
promTempHillo <- mean(datosMet$temperaturaAnual[datosMet$localidad == “Hermosillo”)

Conclusión

  • R puede realizar operaciones aritméticas como una calculadora científica, incluso con escalares y vectores
  • El resultado de estas operaciones se puede guardar en objetos, y estos objetos resultantes usarlos en otras operaciones o funciones.
  • Podemos seleccionar partes especificas de nuestros datos, ya sea usando $, o corchetes[] e indicando dentro la localización de los elementos de interés o alguna condición.
  • Podemos realizar funciones sobre partes especificas de nuestros datos y esto sera muy útil en nuestra exploración y análisis de datos.
Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade