Llamamos pipeline (tubería) al flujo de procesamiento desde la lectura o importación de los datos crudos provenientes del experimento, pasando por el preprocesamiento y limpieza, y el análisis estadístico y visualización. Para completar este proceso hay 3 tipos de archivos fundamentales:
Cuando colectamos datos en un estudio, independientemente del software de presentación de estímulos que usemos (Matlab, PsychoPy, ePrime, App Web, you name it), frecuentemente almacenamos los datos en archivos de texto de valores separados por coma con la extensión .csv, o en archivos de Excel (?) con la extensión .xslx. El primer paso del procesamiento de datos es leer estos archivos desde R y convertirlos a un formato nativo del lenguaje R. Existe un conjunto de funciones aptas para esto, dependiendo de las características de los datos almacenados, estas son: read.table, read.csv y read.delim. Todas usan más o menos los mismos argumentos. [si los datos crudos están almacenados en excel, se puede exportarlos como .csv o para leerlos directamente utilizar el paquete readxl]. Veamos un ejemplo:
# leo el archivo cuadernilloslectura.csv
reading = read.table ("./cuadernillos/cuadernilloslectura.csv", header = TRUE , sep = ",", dec = ",", encoding = "UTF-8")Los argumentos de la función indican a R cuáles son las características del archivo que se va a leer. Aquí se describen los más importantes, pero el menú es mucho más vasto, por más información se puede consultar la ayuda de la función read.table.
El primer y último argumento requieren de un poco más de desarrollo:
El primer argumento es el nombre de archivo. El nombre de archivo debe especificar el directorio (pssst: directorio es lo mismo que carpeta) relativo o absoluto, si no está almacenado en el mismo directorio que el que estamos trabajando. Llamamos path al nombre del archivo junto con su ubicación en la computadora. Para ver en qué directorio estamos trabajando usamos la función getwd() y para especificar un nuevo directorio usamos la función setwd() (de get y set working directory respectivamente). R puede acceder a todos los archivos que estén almacenados en el directorio en que estemos trabajando. Sin embargo, normalmente para conseguir mantener archivos en orden, tenemos más de una carpeta en el directorio en el que estamos trabajando, por ejemplo una carpeta bajo el nombre de input donde almacenamos los archivos de datos crudos. El directorio se indica siempre entre comillas. Para indicar el directorio relativo al directorio en el que estamos trabajando usamos el punto (“.”). El punto indica que lo que viene después son carpetas dentro de la carpeta sobre la que estamos trabajando. Para indicar el directorio absoluto debo especificar todas las carpetas desde el directorio raíz, que en Windows normalmente es el disco duro C:. Para separar los nombres de las carpetas usamos la barra /. Veamos un ejemplo:
# para ver en qué directorio estoy trabajando
getwd()## [1] "C:/Users/Camila/Dropbox/09 R/curso R psico"
# para cambiar el directorio, por ejemplo a la carpeta "input" donde guardo los archivos de datos crudos
# con path relativo
setwd("./input/")
# con path absoluto
setwd("C:/Users/Camila/Dropbox/09 R/curso R psico/input/")
# chequeo que efectivamente haya cambiado de directorio:
getwd()## [1] "C:/Users/Camila/Dropbox/09 R/curso R psico/input"
El último argumento de la función read.table del ejemplo indica el sistema de codificación de caracteres (letras, números, signos, etc) usado en el archivo .csv. El punto de interés para nosotros, es que los tildes requieren del sistema de codificación UTF-8. Para eso tenemos que codificar nuestro .csv como UTF-8 cuando almacenamos los datos durante el experimento (si es que los tildes son importantes),esto se hace en el programa de presentación de estímulos que se use, e indicarlo en la función de lectura de datos. La codificación de un archivo csv puede cambiarse utilizando un buen editor de texto, y también puede cambiarse inintencionalmente usando un mal editor de texto. El editor de texto por defecto en Windows es el Bloc de Notas, o Notepad, y es poco recomendable; preferimos Notepad++; en Linux Kate o Gedit son buenos ejemplos.
Luego de importar datos es fundamental corroborar que están almacenados bajo el tipo de variables adecuada. Por ejemplo, los tiempos de reacción deben estar almacenados como variable numérica y el sexo debe estar almacenado como factor. Muchos problemas posteriores operando entre columnas surgen de datos mal codificados. Para cambiar el tipo de una variable existen las funciones as.factor, as.numeric, as.character, entre otras.
[Nota: También puedo importar datos crudos a través del botón de Import Dataset de la interfaz gráfica del panel Environment de R Studio]
Luego de que leemos los datos crudos, y mientras procesamos, es conveniente guardar las variables que vamos creando en un archivo legible por R para no tener que empezar desde cero cada vez (especialmente cuando manejamos muchos datos crudos y la importación y lectura llevan tiempo computacional). Para guardar todas las variables en el environment o entorno de trabajo, que visualizamos en uno de los paneles de R Studio, usamos la función save.image:
# el nombre de archivo debe incluir la extensión .RData
save.image('lasalidademisdatos.RData')
# puedo especificar un path en el nombre
save.image('./output/lasalidademisdatos.RData')Tip: Una función muy útil para generar nombres de archivos diferentes cada vez que guardamos las variables del entorno de trabajo es Sys.Date(), que devuelve la fecha actual. Se puede usar junto con la función paste (que pega dos conjuntos de strings) para combinar el nombre de archivo y la fecha. De este modo no sobreescribo los archivos .RData que voy almacenando.
Para cargar las variables guardadas en el archivo con extensión .RData usamos la función load:
load('lasalidademisdatos.RData')[Nota: También puedo guardar las variables del entorno de trabajo a través del botón de guardar de la interfaz gráfica del panel Environment de R Studio, y cargarlas a través del botón de abrir en el mismo panel, pero estos botones son inútiles cuando quiero automatizar el proceso en un script]
Un script o guión es un archivo de texto donde se almacena el conjunto de comandos que utilizamos para procesar datos de un mismo estudio que normalmente incluye un bloque de lectura de datos crudos del estudio y conversión a formato nativo de R, la limpieza (por ejemplo, remoción de outliers), y el análisis estadístico y visualización.
Los scripts de R tienen la extensión .R, pero son archivos de texto y pueden abrirse (aunque no ejecutarse) en cualquier editor de texto.
Las buenas prácticas recomiendan el uso de comentarios (precedidos por #), donde indicamos cuál es el fin de uno o un conjunto de comandos, de modo de que alguien más (pero en especial nosotros mismos en el futuro!) pueda entender qué hace cada sección del script. Por ejemplo:
# Saco a los participantes con puntuaciones z demasiado extremas (menores a -2) [df_clas es el nombre del data frame]
df_clas=df_clas[df_clas$zscore>-2,]otro ejemplo:
# Leo la tarea RAN desde los cuadernillos de excel
RAN = read.csv('./cuadernillos/cuadernillosran.csv', encoding='UTF-8')
# OJO! Excel exporta los .csv como ANSI, hay que convertirlos a UTF-8 antes de importarlos en Run ejemplo más (porque es muy importante comentar!!):
# si respondieron con el oido derecho asigno 1, si con el izquierdo asigno 0, entonces si el promedio de los ensayo es mayor a 0.5 tienen ventaja en el oido derecho (tal como esperábamos)
auxL=test_dataDLS$audioL==test_dataDLS$resp
auxR=test_dataDLS$audioR==test_dataDLS$resp
# creo columna acierto2
test_dataDLS$acierto2[auxL]="0"
test_dataDLS$acierto2[auxR]="1"
test_dataDLS$acierto2=as.numeric(test_dataDLS$acierto2)Acá está el ejercicio que acompaña a la sesión 3