R es un lenguaje de programación y, a la vez, un programa que interpreta el código que escribimos.
RStudio es un entorno de desarrollo integrado. Incluye una interfaz gráfica que nos permite interactuar con R de una forma más amigable.
Muchas!
Desde la pantalla de RStudio podemos:
No necesitamos abrir distintas carpetas o distintos programas.
Además, tiene funciones que simplifican la escritura del código y reducen las probabilidades de cometer errores (ej. autocompletar).
RStudio tiene cuatro paneles:
Source: Es donde escribimos y editamos el código, donde creamos nuestros scripts, archivos de texto que R puede interpretar y ejecutar.
Consola: En la consola de R se puede escribir y ejecutar código pero no guardarlo (Por eso utilizamos los scripts). También es donde se muestran los resultados del código que estamos ejecutando.
Environment/Espacio de trabajo: Muestra un listado de los objetos creados.
Files/plots/packages/help: Permite ver los archivos dentro de nuestro proyecto, los gráficos creados, los paquetes que tenemos instalados y documentación acerca de las funciones que usamos.
Un proyecto en R es una forma de organizar todos los archivos vinculados a un mismo trabajo (por ejemplo, a un mismo estudio o artículo).
Vamos a crear un proyecto para trabajar durante la cursada.
Al presionar Create el proyecto se abre automáticamente. Si revisás el panel inferior derecho deberías encontrar que dentro de la lista de archivos (files) hay un uno llamado Taller de R.Rproj.
Ahora vamos a crear algunas carpetas para organizar los archivos que vamos a utilizar durante la cursada:
Para eso, en la consola (panel inferior izquierdo) escribí dir.create(“datos”) y presioná enter. Luego escribí dir.create(“scripts”) y presioná enter nuevamente.
Si todo salió bien, en la pestaña Files del panel inferior derecho deberías encontrar las dos nuevas carpetas.
Programar en R es escribir una serie de instrucciones en forma de código o comandos que R puede interpretar y después llevar a cabo.
Vas a escribir tu código en el editor de texto del panel superior izquierdo y guardarlo. Ese archivo va a ser tu script.
Si cuando abrís el proyecto sólo ves tres paneles (consola, espacio de trabajo y files/plots/packages) posicioná el mouse sobre el ícono que es una hoja en blanco debajo de Archivo o File en la esquina superior izquierda. Luego seleccioná R script. Eso abrirá un archivo de texto llamado Untitled1.
Dentro del mismo script, arriba de todo, tenés una serie de opciones. Una de ellas es un disquete azul .
Presionalo y se abrirá el explorador de archivos para que guardes tu script. En este momento estás ubicado en el proyecto general. Para respetar la estructura que planificamos antes, ingresá a la carpeta scripts y guardalo ahí. Llamalo Clase 1.
Si se guardó correctamente vas a poder verlo en la pestaña Files del panel inferior derecho, dentro de la carpeta scripts.
Empecemos por pedirle a R que resuelva una cuenta sencilla. Posicionate dentro del script Clase 1, escribí la siguiente cuenta y presioná simultáneamente las teclas ctrl y enter (cmd y enter si utilizás una mac).
9 + 4 + 7 + 6 + 8
## [1] 34
El resultado de la cuenta podemos verlo en la consola. Ahora vamos a pedirle que calcule el promedio de esos mismos números. Los sumamos nuevamente y al resultado lo dividimos por la cantidad de elementos.
(9 + 4 + 7 + 6 + 8)/5
## [1] 6.8
En la consola se imprime el resultado, pero este no queda guardado en ningún lado, por lo que deberemos escribir esta secuencia de números cada vez que necesitemos realizar una operación sobre ella. Para evitar esto vamos a asignar los datos a un objeto para poder reutilizarlos todas las veces que necesites. Empecemos con algo sencillo.
Vas a crear un objeto llamado x al que vas a asignarle 2 + 1. Para eso escribí el nombre del objeto (x), el operador de asignación ( <- ), la operación 2 + 1 y presioná ctrl y enter simultáneamente para ejecutar el código.
El código se lee de derecha a izquierda: 2 + 1 se asigna a x.
x <- 2 + 1
Fijate que, a diferencia de cuando realizamos una operación sin guardarla, el resultado no se imprime en la consola. Pero si mirás el environment o espacio de trabajo hay un nuevo objeto llamado x que vale 3. Para que se imprima en la consola necesitamos escribir el nombre del objeto (en este caso x, pero podría ser cualquiera) y presionar ctrl+enter nuevamente.
x
## [1] 3
En R podemos trabajar con distintos tipos de objetos. El que acabás de crear es un vector.
Un vector es la estructura de datos más simple en R. Se trata de una secuencia de elementos o valores del mismo tipo. El vector x tiene un único valor y este es de tipo numérico. Ahora que lo creaste, podés realizar operaciones con él.
Sumale una constante (5):
x + 5
## [1] 8
Este resultado, como no estamos asignándoselo a un objeto, se imprime en la consola. Pero podríamos asignárselo al mismo vector x para modificarlo:
x <- x + 5
x
## [1] 8
Si mirás en el espacio de trabajo o environment vas a ver que x ahora vale 8.
El código siguiente va a generar un error. Intentá identificar cuál es el problema.
X
## Error in eval(expr, envir, enclos): objeto 'X' no encontrado
R es sensible a las mayúsculas y minúsculas. Si bien creamos el objeto x (minúscula), el objeto X (mayúscula) no existe.
Ahora vamos a borrar el objeto x. Para eso tenés que usar la función rm (remove).
rm(x)
Mirá el environment nuevamente. El objeto x ya no existe por lo que si intento imprimir su valor obtengo el mismo error que cuando escribí la X mayúscula.
x
## Error in eval(expr, envir, enclos): objeto 'x' no encontrado
Ejercicio 1: Creá un segundo vector llamado edad que valga 9.
Ahora que sabés cómo crear un vector de un único valor, vamos a crear uno de más elementos. Separamos un número de otro con una “,” y los combinamos usando la función c().
edad <- c(9, 4, 7, 6, 8)
Si mirás el environment ahora tenés un objeto llamado edad que es de tipo numérico (num) que tiene 5 elementos ([1:5]).
Ahora, vamos a sumarle 5 a cada valor que está guardado en el vector edad.
edad + 5
## [1] 14 9 12 11 13
Cuando realizamos una operación matemática sobre un vector, esa operación se aplica a cada uno de los elementos que forman el vector.
edad / 3
## [1] 3.000000 1.333333 2.333333 2.000000 2.666667
Segmentar un vector es extraer una porción de ese vector, ya sea para imprimirlo en la consola como para guardarlo en un nuevo objeto.
En un vector cada elemento tiene una posición fija. En el vector edad el valor 9 ocupa la primera posición, el 4 la segunda, el 7 la tercera, el 6 la cuarta y el 8 la quinta.
Vamos a empezar por imprimir el valor ubicado en la posición 4 del vector “edad”.
edad[4]
## [1] 6
Para imprimir todos los valores entre dos posiciones usamos “:”. Para imprimir todos los valores entre las posiciones 2 y 4 escribí:
edad[2:4]
## [1] 4 7 6
¿Qué podés hacer si sólo querés imprimir los valores en dos o más posiciones que no son consecutivas?
edad[2, 4]
## Error in edad[2, 4]: número incorreto de dimensiones
Recordá que cuando queremos encadenar valores que no son consecutivos necesitamos usar la función c() para combinarlos.
edad[c(2, 4)]
## [1] 4 6
Ejercicio 2: Obtené los valores ubicados en las posiciones 1 y 3 del vector edad y asignáselas a un nuevo vector llamado edad_segmento.
Las funciones en R son comandos que reúnen una secuencia de operaciones o tareas para poder usarlas repetidamente.
Por ejemplo, antes vimos que podemos sumar un conjunto de valores usando el símbolo +. Pero también podemos usar la función sum() sobre un vector creado previamente.
sum(edad)
## [1] 34
Cada función tiene un nombre (en este caso sum) y una serie de argumentos que son los datos que tenés que ingresar para que se obtenga un resultado.
Para ver los argumentos de una función podemos ejecutar ?función().
?sum()
Esto abrirá una pantalla de ayuda en el panel inferior derecho. Es la documentación de la función. Incluye el nombre de la función, la descripción de la tarea que hace, y bajo el subtítulo Arguments podemos encontrar qué valores necesitamos incluir.
En el caso de sum() encontramos:
… numeric or complex or logical vectors.
Es decir, necesita que le indiquemos un vector de tipo numérico, complejo o lógico (vamos a describir los distintos tipos de vectores un poco más adelante).
Otra función que podemos usar es length(). Esta función nos dice el largo del vector, es decir, la cantidad de elementos incluidos.
length(edad)
## [1] 5
Ejercicio 3: Ingresá a la sección de ayuda para buscar los argumentos que toma length()
Ahora podés combinar las funciones sum() y length() para calcular el promedio del vector edad.
sum(edad)/length(edad)
## [1] 6.8
Sin embargo, esto no es necesario ya que hay otra función que se encarga de esto: mean() (media o promedio)
mean(edad)
## [1] 6.8
Los datos en R pueden ser de distinto tipo. Hasta el momento creaste un vector numérico. Pero cuando no sabemos de que tipo se trata podemos utilizar la función typeof() (tipo de).
typeof(edad)
## [1] "double"
Sabemos que edad es un vector numérico, pero R nos dice que es un double.
En R vamos a encontrar dos tipos de datos numéricos:
En general, a menos que se lo indiquemos explícitamente R interpreta todo valor numérico como un double.
Otro tipo de dato es el logical. Un vector de tipo lógico sólo incluye valores TRUE (verdadero) o FALSE (falso), necesariamente escritos en mayúscula.
edad_par <- c(FALSE, TRUE, FALSE, TRUE, TRUE) # tab
edad_par
## [1] FALSE TRUE FALSE TRUE TRUE
Estos vectores muchas veces se crean en base a si otro vector cumple o no una condición. Voy a darte un ejemplo con una función que vamos a ver más adelante:
edad_par <- ifelse(edad %% 2 == 0, TRUE, FALSE)
edad_par
## [1] FALSE TRUE FALSE TRUE TRUE
Tal vez no tenga tanto sentido cuando se trata de un vector de 5 elementos, pero sí cuando es más numeroso. Además, evita que nos equivoquemos en alguno de los valores por hacerlo a mano.
Si realizamos una operación numérica sobre un vector lógico, R interpreta al valor TRUE como 1, y a FALSE como 0.
sum(edad_par)
## [1] 3
mean(edad_par)
## [1] 0.6
El último tipo de dato que vamos a ver es character (caracteres). Cuando los valores del vector son caracteres, en lugar de números, necesitás escribirlos entre comillas (" ").
nombres <- c("Juan", "Ana", "María", "José", "Pedro")
nombres
## [1] "Juan" "Ana" "María" "José" "Pedro"
A los vectores de tipo character no se les puede aplicar operaciones numéricas:
sum(nombres)
## Error in sum(nombres): 'type' (character) de argumento no válido
Cuando nuestros datos son números que no representan valores numéricos, sobre los que no tiene sentido realizar operaciones matemáticas, también podemos escribirlos entre comillas y así tener un vector de tipo character.
edad_texto <- c("9", "4", "7", "6", "8")
edad_texto
## [1] "9" "4" "7" "6" "8"
Si mirás el environment edad es de tipo numérico (num) pero edad_texto es de tipo character (chr). Si intentamos realizar una operación numérica sobre este vector obtendremos un error:
sum(edad_texto)
## Error in sum(edad_texto): 'type' (character) de argumento no válido
Puede suceder que al importar datos de otra fuente, R interprete como texto a valores numéricos, haciendo que cuando queramos aplicar una operación sobre ellos obtengamos este error.
Hay una serie de funciones que nos permiten pasar de un tipo de dato a otro. Para convertir edad_texto en un vector numérico vamos a usar la función as.numeric():
edad_texto <- as.numeric(edad_texto)
typeof(edad_texto)
## [1] "double"
Podríamos encontrarnos con la situación opuesta. Por ejemplo, el vector sexo puede estar formado por 1s (femenino) y 0s (masculino). Estos números representan categorías. Sería incorrecto, por ejemplo, calcular el promedio.
sexo <- c(0, 1, 1, 0, 0)
typeof(sexo)
## [1] "double"
sexo <- as.character(sexo)
typeof(sexo)
## [1] "character"
Dijimos que los vectores son secuencias de elementos de un mismo tipo. ¿Qué sucede si incluimos valores de distinto tipo?
Mirá lo que sucede cuando incluyo un valor lógico dentro de un vector numérico:
x <- c(1, 2, 1, TRUE)
sum(x)
## [1] 5
y <- c(1, 2, 1, FALSE)
sum(y)
## [1] 4
typeof(x)
## [1] "double"
typeof(y)
## [1] "double"
En ese caso TRUE pasa a valer 1, por eso la suma de x es 5, mientras que FALSE vale 0, por eso la suma de y es 4. Ambos continuan siendo de tipo double o numérico.
Cuando incluimos en un mismo vector valores numéricos y de tipo character, este último es el que prevalece:
z <- c("a", "b", "3", 4, 6, "c", 7)
typeof(z)
## [1] "character"
Hay un tipo de valor especial que en R representa un valor faltante o missing: NA. Esta valor se escribe en mayúscula y sin comillas (al igual que TRUE y FALSE).
NA no es un tipo de dato, sino un indicador de que un espacio está vacío.
x <- c(1, NA, 5)
typeof(x)
## [1] "double"
y <- c("a", NA, "b")
typeof(y)
## [1] "character"
Por eso no modifica el tipo del vector.
Puede generar dificultades con algunas funciones. Por ejemplo, cuando quiero aplicar la función sum() al vector x, obtengo lo siguiente:
sum(x)
## [1] NA
Hay otro argumento para la función sum() que no usamos hasta el momento. Busquemos cual es:
?sum()
sum(x, na.rm = TRUE)
Con na.rm = TRUE le estamos pidiendo a sum() que realice la operación ignorando los NA.
Ejercicio 4:
1. Crear un vector de tipo character y calcular la cantidad de elementos que tiene el vector.
2. Crear un vector numérico que incluya 2 NA y sumá los valores.
Podemos elegir cualquier nombre para un vector mientras que:
Son nombres válidos:
grupo <- 2
grupo1 <- 2
grupo_1 <- 2
GrupoUno <- 2
grupo.uno <- 2
No son válidos:
1grupo <- 2
## Error: <text>:2:2: unexpected symbol
## 1:
## 2: 1grupo
## ^
grupo?1 <- 2
## Error in 1 <- 2: lado izquierdo de la asignación inválida (do_set)
grupo-1 <- 2
## Error in grupo - 1 <- 2: no se pudo encontrar la función "-<-"
This work is licensed under a Creative Commons Attribution 4.0 International License.