Práctica 2. Conocimientos básicos de programación en R
Presentación
0. Objetivo de la práctica
El objetivo de esta guía práctica es introducirnos en los procedimientos básicos del uso del lenguaje y ambiente R.
En detalle, aprenderemos:
Herramientas básicas de programación en R
Operadores en R
Tipos de datos
Flujo de trabajo en R
Tal vez una de las dificultades más comunes o cotidianas del uso de R es el orden de trabajo, en donde tenemos cientos de archivos, scripts, gráficos, bases de datos u otros repartidos desordenadamente en nuestro computador. También se da mucho el caso en que, cuando queremos trabajar con alguien, tenemos que cambiar las rutas de los archivos, por ejemplo en dónde están las bases de datos, ya que nuestros ordenadores y usuarios se llaman y son escencialmente distintos.
¿Cómo podemos sortear eso? Siguiendo un flujo de trabajo reproducible, autocontenido y ordenado. En este curso trabajaremos R con un flujo de trabajo reproducible, basado en el sistema IPO. El protocolor IPO es una plantilla/protocolo de estructura digital de carpetas que tiene por objetivo el organizar, procesar y documentar los datos de un proyecto de investigación con miras a la apertura de los datos en un repositorio público y de acceso libre. En concreto, el sistema IPO se propone abordar brevemente todo lo referente a los Datos, Métodos y Resultados.
Lleva este nombre por el sistema de carpetas que se implementan: Input, Procesamiento y Output. En la carpeta Input guardaremos todos aquellso recursos iniciales que usaremos, como las bases de datos, el libro de códigos, entre otros. En la carpeta de Procesamiento, como dice el nombre, guardaremos todos los archivos que procesen y analicen datos. En la carpeta Output guardaremos todo aquello que hayamos producido en los archivos de procesamiento, como las bases de datos procesadas listas para compartir o publicas, los documentos de reporte, informes o analísis, gráficos o tablas.
La implementación de la reproducibilidad en este tipo de protocolos se basa en generar un conjunto de archivos auto-contenidos organizado en una estructura de proyecto que cualquier persona pueda compartir y ejecutar. En otras palabras, debe tener todo lo que necesita para ejecutar y volver a ejecutar el análisis. Para conocer más, visita el Laboratorio de Ciencia Abierta.
Rproject
Un Rproject es una herramienta de R que nos permite establecer un directorio de trabajo en una carpeta de nuestro computador. Al hacerlo, establecemos un espacio de trabajo que permite crear una estructura de carpetas donde guardar los documentos asociados al proyecto. De esta forma, creamos un conjunto de archivos autocontenidos en un solo lugar que nos permite organizar nuestro trabajo y facilitar la reproducibilidad. En las próximas sesiones estableceremos un protocolo de trabajo que permite organizar y armonizar el trabajo: el protocolo IPO.
Para crear un Rproject:
Abrir Rstudio
Seleccionar Archivo -> Nuevo proyecto
Seleccionamos la opción de directorio existente
Seleccionamos la carpeta donde descargamos nuestro repositorio de Github en el paso anterior
Apretamos el botón de crear proyecto
1. Conocimientos básicos de programación
Revisemos algunos conocimientos básicos para la programación en R. Pero antes, tengamos dos cosas en mente:
Primero, ¿qué es codificar?, en programación codificar corresponde a un proceso de entrega de instrucciones en un lenguaje específico, siguiendo un orden lógico y coherente.
Segundo, de aquí en adelante nos manejaremos con una máxima en el curso; existe un acuerdo implícito entre tú y R: R hará todos los cálculos por ti, pero en cambio tú debes dar las instrucciones con total precisión.
1.1 R como calculadora
Uno de los usos más sencillos y que están a la base de R, es usarlo como una calculadora.
5+5
[1] 10
25/5
[1] 5
2*2
[1] 4
27-2
[1] 25
Como podrás ver, el resultado de estas instrucciones aparecen como un [1]
en la consola. También podemos hacer operatorias más complejas y con más cálculos.
12*(7+2)+(45-32)+8
[1] 129
22^2 - 2^2
[1] 480
1/200 * 30
[1] 0.15
1.2 Un lenguaje orientado a objetos
R es un lenguaje de programación orientado a objetos. ¿Qué significa eso?, implica que podemos crear elementos dentro del ambiente de R, a los cuales les asignaremos información que quedará almacenada, información que puede ir desde números, palabras, cálculos hasta grandes bases de datos.
Todas las instrucciones en R en las que crees objetos, es decir, instrucciones de asignación, tendrán la misma estructura:
nombre_objeto <- valor
El asignador <-
se utiliza para crear objetos y forma parte de uno de los operadores usados en R.
Los elementos que podemos asignar a objetos son múltiples, como números, palabras acompañadas siempre de corchetes " "
y vectores que corresponden a un conjunto o secuencia de elementos del mismo tipo definidos por la funcion de concatenar = c()
.
Veamos un ejemplo creando objetos:
<- 4 # asignar
x
# ejecutar x
[1] 4
<- "Hola mundo" # los carácteres alfabéticos siempre van acompañados de corchetes
y
y
[1] "Hola mundo"
Hagamos un pequeño reto: ¿Cuál es el valor de a y b? Si a <- 5; b <- a; a <- 4
<- 5
a <- a
b <- 4
a
print(a) # imprimir en la consola
[1] 4
print(b)
[1] 5
+ 10 a
[1] 14
Ahora, sea z = a^2 ¿qué resultado obtenemos de a * b + z?
<- a^2 # asignar
z
* b + z a
[1] 36
¿Y concatenando? Hacemos un vector.
<- c(18,22,36,19,35) # concatenar (variable de razon)
edad
edad
[1] 18 22 36 19 35
<- c(3,1,1,2,3) # masculino = 1; femenino = 2; transgenero = 3 (variable nominal)
genero
genero
[1] 3 1 1 2 3
<- c("ABC1", "C2", "E", "AbC1", "E") # tambíen se pueden usar carácteres (variable ordinal)
gse
gse
[1] "ABC1" "C2" "E" "AbC1" "E"
Además de lo anterior, en R es fundamental la creación de data.frames. Un Data.frame es una estructura de datos de dos dimensiones (columnas y filas), donde las columnas pueden ser de diferente naturaleza, pero deben tener el mismo largo. A partir de ella agrupamos variables en una matriz, o sea, construimos una base de datos. Es como “pegar” las columnas (variables) una al lado de otra.
Creemos un data.frame con los vectores que ya creamos antes.
<- data.frame(genero, gse, edad) # Resulta como objeto de "datos" en
base1 # entorno.
base1
genero gse edad
1 3 ABC1 18
2 1 C2 22
3 1 E 36
4 2 AbC1 19
5 3 E 35
Como puedes ver, para crear el data.frame usamos la función que lleva el mismo nombre, colocando dentro del paréntesis los vectores que creamos anteriormente: data.frame(mis_vectores)
.
Ahora, creemos un data.frame
desce cero. En este ejemplo, crearemos los vectores dentro de la función data.frame()
.
# Ejemplo de como crear un data.frame desde 0:
<- data.frame(Sexo=c("H","M","H","M","H","M"),
base2 Estatura=c(1.83,1.76,1.82,1.60,1.90,1.66),
Peso=c(67,58,66,48,75,55))
head(base2) # Me permite visualizar las primeras filas
Sexo Estatura Peso
1 H 1.83 67
2 M 1.76 58
3 H 1.82 66
4 M 1.60 48
5 H 1.90 75
6 M 1.66 55
2. Operadores en R
Antes de trabajar con datos, debemos conocer el concepto de operadores. Estos símbolos no son de uso exclusivo en R, pero no todos tienen el mismo significado que en otros softwares.
Los operadores son símbolos que permiten, en los distintos procedimientos de procesamiento, simplificar procesos. Por ejemplo, serán útilizados cuando filtremos nuestros datos para personas de ciertas categorías, cuando calculemos variables nuevas (de manera aritmética o condicional) o, simplemente, cuando queramos hacer procesos “concatenados”.
Veamos algunos ejemplos:
20 == 5 # igualdad
[1] FALSE
30 >= 14 # mayor o igual que
[1] TRUE
22 <= 2 # menor o igual que
[1] FALSE
25 != 10 # no es igual a
[1] TRUE
= 10; y = 5; p <= y # operatoria en objetos p
[1] FALSE
3. Tipos de datos
3.1 ¿Qué son los tipos de datos?
En R, al igual que en la mayoría de lenguajes de programación, contamos con datos de diversos tipos, en razón de los cuales podemos realizar determinados procedimientos de tratamiento o análisis.
Los tipos de datos están íntimamente relacionados con el nivel de medición de las variables a las que corresponden. Como viste en clases, la teoría de los niveles de medición contempla cuatro tipos:
3.2 ¿Qué tipos de datos encontramos en R?
Para responder esta pregunta, exploremos algunos datos. En esta oportunidad trabajaremos con el Estudio Longitudinal Social de Chile, que es una encuesta desarrollada para analizar intertemporalmente la evolución del conflicto y cohesión en la sociedad chilena, basándose en modelos conceptuales descritos en la literatura nacional e internacional que abordan dichas materias. Se orienta a examinar los principales antecedentes, factores moderadores y mediadores, así como las principales consecuencias asociadas al desarrollo de distintas formas de conflicto y cohesión social en Chile. Su objetivo fundamental es constituirse en un insumo empírico para la comprensión de las creencias, actitudes y percepciones de los chilenos hacia las distintas dimensiones de la convivencia y el conflicto, y como éstas cambian a lo largo del tiempo.
Importar datos
En R es es posible importar y exportar datos que se encuentren en cualquier formato: ya sea .csv, .dta, .sav, .xlsx y, por supuesto, .rds y .RData. Sin embargo, para poder hacerlo, lo primero es instalar y cargar las librerías que contienen las funciones necesarias para la importación de distintos tipos de archivos.
Pero, ¿dónde están mis datos? Como hemos mencionado, nuestros datos los dejaremos en la carpeta input/data
de nuestro proyecto. La base con la que trabajaremos en este práctico pueden encontrarla en la página oficial de ELSOC en este enlace.
Luego de descargar la base de datos, asegurate de dejar el archivo .sav en la carpeta input/data
de tu proyecto. Nota: Los datos tendrán distinto nombre según su formato (.sav, .csv, .dta, etc.).
Una vez descargados los datos, procedemos a importar nuestra base de datos. Para ello, en nuestro script, dejamos indicado que a partir de la lectura de los datos con load()
, crearemos un objeto que contiene la base de datos. Fijate en el Enviroment, ya que si lo anterior se logra, el objeto aparecerá allí.
La estructura general para importar datos es la siguiente:
read_*("ruta_hacia_archivo/nombre_archivo.*")
Sin embargo, por esta vez podemos descargar la base desde internet
load(url(("https://github.com/cursos-metodos-facso/metod1-MCS/raw/main/resource/files/ELSOC_W05_v1.0_R.RData"))
Para importar los datos en R debemos tener en consideración tres cosas:
Cómo se llaman los datos (en nuestro caso ELSOC_W05_v1.0_SPSS)
El formato de nuestros datos (en nuestro caso .sav)
El lugar de donde están alojados nuestros datos
Importar datos en otros formatos
No siempre nuestros datos vendrán en un único formato. Para ello, R cuenta con otras formas de leer distintos tipos de formatos.
readxl para archivos .xlsx
haven para archivos .sav
readr para .csv
Explorar datos
Lo más probable es que no trabajemos con todos los datos que importamos, por lo que debemos seleccionar aquellas variables con las que trabajaremos para nuestro problema de investigación (cualquiera sea).
Pero, para ello primero debemos explorar nuestros datos. En R, las funciones más comunes para explorar datos son:
View(elsoc_2021) # Ver datos
names(elsoc_2021) # Nombre de columnas
dim(elsoc_2021) # Dimensiones
Tenemos una base de datos con 2740 casos o filas y con 311 variables o columnas.
Cargar librerías
En R se trabaja a partir de paquetes (packages). ¿Qué son? De forma resumida, los paquetes son un conjunto de funciones o herramientas que pueden ser usadas en R. Los directorios de R donde se almacenan los paquetes se denominan librerías. La lógica es instalar paquetes y luego cargar (o llamar) las librerías cada vez que es necesario usarlas.
Usualmente para cargar paquetes lo hacemos de la siguiente manera:
install.packages("paquete")
library(paquete)
Pero en esta ocasión utilizaremos un paquete llamado pacman, que facilita y agiliza la lectura (instalación y carga) de los paquetes a utilizar en R. De esta forma lo instalamos 1 única vez así:
install.packages("pacman")
library(pacman)
Luego instalaremos y cargaremos los paquetes de R de la siguiente manera, volviendo más eficiente el procedimiento de carga de paquetes.
En este práctico utilizaremos seis paquetes
pacman
: este facilita y agiliza la lectura de los paquetes a utilizar en Rtidyverse
: colección de paquetes, de la cual utilizaremos dplyr y havendplyr
: nos permite seleccionar variables de un set de datoshaven
: cargar y exportar bases de datos en formatos .sav y .dtacar
: para recodificar/agrupar valores de variables
::p_load(dplyr, # para manipular datos
pacman# para recodificar datos
car )
Como se puede ver, antes de la función p_load hay un ::
, esto se refiere a que se “fuerza” que esa función provenga de ese paquete (en este caso del paquete pacman
).
Tipos de datos
I) Character
Los datos character
están directamente asociados a las variables cualitativas (o categóricas). Generalmente suelen ser variables de texto abierto, como es el caso de la variable pais, que detalla el país de procedencia de la persona encuestada.
Para conocer cuál es el tipo de variable en R, utilizamos el comando class()
, y para detallar dentro de la base de datos cuál es la variable de interés, utilizamos el símbolo $
posterior a la base de datos:
class(elsoc_2021$comuna) # siempre es la misma estructura = base$variable
[1] "character"
Sin embargo, estas variables no tienden a ser las mejores a la hora de presentar nuestros resultados. Como solución, tenemos las variables de tipo Factor.
II) Factor
Las variables de tipo factor
son ideales para trabajar con variables de tipo nominal u ordinal. Esto es así debido a que permiten establecer un orden entre las categorías de la variable, lo cual es fundamental si trabajamos, por ejemplo, con variables nominales como el sexo de los encuestados, o si trabajamos con variables ordinales como su ideología política.
class(elsoc_2021$m0_sexo)
[1] "factor"
class(elsoc_2021$m38) #religion
[1] "factor"
III) Numeric
Las variables de tipo numeric
son variables de tipo númerica, las cuales pueden ser intervales o de razón. Así, por ejemplo, cuando trabajamos con variables de razón trabajamos con variables como el número de hijos o la edad (aunque sería extraño encuestar a alguien con 0 años).
class(elsoc_2021$m0_edad)
[1] "numeric"
Resumen
Hoy aprendimos distintas herramientas básicas para utilizar el lenguaje y ambiente R. Como resumen:
Utilizar R como calculadora, su lógica orientada a objetos creando objetos, vectores y data.frames
Operadores en R
Tipos de datos en R como variables cualitativas (character o factor) y cuantitativas (numeric)