0.1 Intro

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.

0.2 Variables

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)]

0.2.1 Tipos de variables: num, char y logical

“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 = TRUE

miro 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

0.2.2 Variables de múltiples elementos: vectores y data frames

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

0.3 Indexación

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

0.3.1 Indexación por lógicos

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
  • Atención! Diferencia entre = y ==:
    • = (igual) se usa para asignar variables, como definimos al principio;
    • == (igual a) se usa para evaluar si dos variables son iguales, y la respuesta es un lógico TRUE o FALSE.

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

0.4 Cuarto tipo de variable: el factor

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"

0.5 Funciones útiles

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:

Algunas funciones básicas de estadística descriptiva para vectores son:


0.6 Shortcuts de teclado útiles


0.7 Ayuda