Esta es una mini guía de introducción de los conceptos y funciones más útiles para empezar a manejar el entorno de R con fines de procesamiento de datos de estudios experimentales. Se acompaña de un ejercicio que utiliza los conceptos y funciones presentados accesible en http://rpubs.com/camilazuga/ejercicio1.
Las variables son etiquetas que permiten guardar información. Las etiquetas pueden tener cualquier nombre, a, pepito, myVariable, stroop, o el nombre que prefiera. Las variables se definen a través de la asignación con alguno de los operadores = o <- o ->, son iguales, y el espacio no importa. Por ejemplo:
#estas líneas hacen lo mismo
a=1
a = 1
a <- 1
1 -> a[Tip: el símbolo # me permite hacer comentarios en el código sin que R los interprete]
Si queremos chequear qué está guardado bajo la etiqueta de a, entonces tipeamos “a” y vemos la respuesta:
## [1] 1
[Nota: El símbolo ## muestra que es la respuesta en la consola, el [1] indica el número de fila (por ahora no importa)]
“a” es una variable numérica o num. Hay otros dos tipos de variables muy comunes: las llamadas char, que toman cualquier valor de texto y cuyos valores se escriben siempre entre comillas; y variables lógicas llamados logical que toman solo dos valores, TRUE o FALSE. Por ejemplo:
a = "hello world"
b = TRUEmiro lo que guardé:
a## [1] "hello world"
b## [1] TRUE
# esto no funciona porque faltan las comillas
a = hello world
a## Error: <text>:2:11: unexpected symbol
## 1: # esto no funciona porque faltan las comillas
## 2: a = hello world
## ^
Hay un tipo de variable especial para indicar el vacío o la ausencia de valor, el NA, que sigifica not available. Esto es útil para indicar datos faltantes en un experimento, por ejemplo la edad de un participante.
c = NA
c## [1] NA
Podemos almacenar muchos elementos en una sola variable, a una variable de muchos elementos le llamamos vector. Para crear un vector usamos la función combine, que se llama con la letra c [La sintaxis de las funciones es siempre con paréntesis curvo: nombredelafunción(argumentos), ampliaremos en sesión 2…]. Los vectores pueden contener elementos num, char, o logical, pero siempre elementos de un solo tipo. Por ejemplo:
a = c(47,74,44,52)
b = c("José","Pepe","Juan","Martín")a ## [1] 47 74 44 52
b## [1] "José" "Pepe" "Juan" "Martín"
Para combinar distintos tipos de elementos en una sola variable, usamos un data frame. El data frame es el tipo de variable más común para almacenar datos experimentales porque permite combinar datos numéricos y datos de texto en una misma variable. El data frame es un conjunto de filas y columnas, las filas frecuentemente corresponden a observaciones (por ejemplo, participantes) y las columnas a variables (experimentales) (por ejemplo, el tiempo de reacción, la tasa de aciertos, el sexo, la edad, etc…). Para crear un data frame usamos la función data.frame:
# Unimos los dos vectores anteriores para crear data frame
miPrimerDataFrame=data.frame(a,b)
# o creamos un data frame de novo
miSegundoDataFrame=data.frame(participante=c("S1","S2","S3","S4","S5"),sexo=c("F","M","M","M","F"),edad=c(18,25,22,18,20))miPrimerDataFrame## a b
## 1 47 José
## 2 74 Pepe
## 3 44 Juan
## 4 52 Martín
miSegundoDataFrame## participante sexo edad
## 1 S1 F 18
## 2 S2 M 25
## 3 S3 M 22
## 4 S4 M 18
## 5 S5 F 20
Hay diversas maneras de acceder a los elementos de un data frame. El paréntesis recto “[ , ]” es la más ampliamente utilizada (se usa también en Matlab y en Python y tiene origen en el lenguaje C), permite indicar el número de fila y el número de columna del elemento de interés, en ese orden, primero fila, después columna, separados por una coma. Para acceder a todos los elementos de una columna, en el paréntesis recto dejo vacío el espacio correspondiente al número de columna, lo mismo para acceder a todos los elementos de una fila.
En R, también puedo acceder a todos los elementos de una columna con el símbolo de “$” y el nombre de la columna de interés. Esta forma tiene la ventaja de que no necesito acordarme la posición de la columna para llamarla, y los nombres son más fáciles de recordar. Combinando el símbolo de pesos y el paréntesis recto puedo indicar columna y fila respectivamente.
# el elemento almacenado en la fila 2 y la columna 1 de miPrimerDataFrame
miPrimerDataFrame[2,1]## [1] 74
# todos los elementos de la columna 1 (que se llama "a") de miPrimerDataFrame
# estas dos líneas hacen lo mismo
miPrimerDataFrame[,1]## [1] 47 74 44 52
miPrimerDataFrame$a## [1] 47 74 44 52
# todos los elementos de la fila 2 de miPrimerDataFrame
miPrimerDataFrame[2,]## a b
## 2 74 Pepe
# se pueden combinar ambos tipos de indexación, por ejemplo:
# el elemento almacenado en la fila 2 y la columna 1 ("a") de mi PrimerDataFrame
miPrimerDataFrame$a[2]## [1] 74
También puedo acceder a un subconjunto de los elementos de un vector o data frame, a través del uso de “:”. Los dos puntos generan una secuencia de números desde y hasta:
# Una secuencia del 1 al 3
misecuencia1 = 1:3
misecuencia1## [1] 1 2 3
# Una secuencia de 100 a 1000
misecuencia2 = 100:1000
# Aplicado a un data frame:
#Los primeros 3 elementos de la columna a
miPrimerDataFrame$a[1:3]## [1] 47 74 44
# Desde la tercera hasta la quinta fila, todas las columnas
miSegundoDataFrame[3:5,]## participante sexo edad
## 3 S3 M 22
## 4 S4 M 18
## 5 S5 F 20
A veces quiero acceder solamente a algunos elementos del data frame, los que cumplan con una determinada condición. Para eso es muy útil indexar por lógicos. En la sección de Tipos de variables definimos un lógico como una variable que puede tomar solamente dos valores: TRUE o FALSE. Si en miSegundoDataFrame quiero saber qué participantes son mayores a 21 años, puedo crear un vector lógico que tome el valor de TRUE en los elementos en que esta condición se cumple (mayor a 18), y FALSE en el resto. Para eso necesito un nuevo tipo de operadores, los operadores lógicos o booleanos:
| operador | uso |
|---|---|
| > | mayor |
| < | menor |
| => | mayor igual |
| <= | menor igual |
| & | AND |
| | | OR |
| == | igual a |
| != | no igual a |
Veamos cómo funcionan:
# creo un vector lógico y lo asigno a la variable "mayores"
mayores = miSegundoDataFrame$edad > 18
#miro qué guardé
mayores## [1] FALSE TRUE TRUE FALSE TRUE
El vector mayores tiene tantos elementos como el número de filas de miSegundoDataFrame (o sea, en este caso, tantos como número de participantes). Para cada elemento, indica si la condición “mayor a 18” se cumple (TRUE) o no se cumple (FALSE). Puedo usar este vector entonces como un índice de los elementos a los que quiero acceder para cualquier otro vector de las mismas dimensiones (tamaño), por ejemplo, el vector miSegundoDataFrame$participantes:
# busco a los participantes mayores de 18
miSegundoDataFrame$participante[mayores]## [1] S2 S3 S5
## Levels: S1 S2 S3 S4 S5
# esto es equivalente a indicar una por una las filas
miSegundoDataFrame$participante[c(2,3,5)]## [1] S2 S3 S5
## Levels: S1 S2 S3 S4 S5
# si quiero combinar dos condiciones, mayores a 18 y menores a 21, uso &
entre = miSegundoDataFrame$edad > 18 & miSegundoDataFrame$edad < 21
miSegundoDataFrame$participante[entre]## [1] S5
## Levels: S1 S2 S3 S4 S5
# otro ejemplo, busco la edad de Juan en miPrimerDataFrame:
edadJuan=miPrimerDataFrame$b=="Juan"
miPrimerDataFrame$a[edadJuan]## [1] 44
Si miramos la salida de este último bloque de líneas, vemos que aparece un elemento nuevo Levels que no aparecía antes. Esto se debe a que la columna participante de miSegundoDataFrame es de un tipo de variable llamado factor. Los factores se usan para variables nominales o categóricas, esto es, variables que toman un conjunto de valores no numéricos sin ningún tipo de orden en particular, por ejemplo, nombre, sexo, condición experimental, etc. Los factores tienen niveles o levels, que son todos los valores únicos posibles que puede tomar el factor. Por ejemplo, si el factor es sexo los niveles son femenino o masculino. Para acceder a los niveles de una variable uso la función levels.
levels(miSegundoDataFrame$participante)## [1] "S1" "S2" "S3" "S4" "S5"
levels(miPrimerDataFrame$b)## [1] "José" "Juan" "Martín" "Pepe"
levels(miSegundoDataFrame$sexo)## [1] "F" "M"
A menudo queremos (debemos!) cambiar los nombres de las columnas de un data frame para tener nombres informativos y fáciles de recordar. Por ejemplo, los nombres de las columnas de miPrimerDataFrame son poco informativos (a y b), lo podemos ver y cambiar usando la función colnames. Para asignar los nuevos nombres, los agrupamos con la función combine. También podemos cambiar el nombre de una sola columna, indicando la posición de la columna con paréntesis recto luego de colnames.
# ver nombres de columnas
colnames(miPrimerDataFrame)## [1] "a" "b"
# asignar nuevos nombres a todas las columnas
colnames(miPrimerDataFrame)=c("edad","nombre")
colnames(miPrimerDataFrame) #los miro## [1] "edad" "nombre"
# asignar nuevo nombre solamente a la primera columna
colnames(miPrimerDataFrame)[1]="años"
colnames(miPrimerDataFrame) #los miro## [1] "años" "nombre"
Es frecuente que los data frames tengan dimensiones que no permitan explorarlo a simple vista, algunas funciones básicas para explorar un data frame son:
View: para explorarlo a simple vista
head: primeras 6 filas
tail: últimas 6 filas
nrow: número de filas
ncol: número de columnas
dim: número de filas y columnas
class: indica el tipo de variable
str: estructura, indica las dimensiones y el nombre y tipo de variable de cada columna en un data frame
summary: resumen, estadística descriptiva de cada columna en un data frame
complete.cases : indica casos completos, devuelve un vector lógico con TRUE en filas sin NA
Algunas funciones básicas de estadística descriptiva para vectores son:
length: largo o número de elementos
sum: suma
max: máximo
min: mínimo
mean: promedio
sd: desvío estándar
is.na: lógico de la posición de los valores NA
Tab : completa el texto con las variables almacenadas en el environment o las funciones de las librerías cargadas
Up: en la Consola, recorre los comandos escritos anteriormente
Ctrl + Up: en la Consola, recorre los comandos escritos anteriormente que coinciden parcialmente con el texto escrito
Ctrl + Enter: en la Fuente (Source), ejecuta una selección de código o el código de la línea donde está parado el cursor
?(functionname): en la Consola, muestra la información de ayuda o uso de la función
help(functionname): idem