Introducción a R

Mon, Jul 20, 2020 9-minute read

R es un conjunto integrado de programas para manipulación de datos, cálculo y gráficos. Entre otras características dispone de: 1) almacenamiento y manipulación efectiva de datos, 2) operadores para cálculo sobre variables indexadas, en particular matrices, 3) una amplia, coherente e integrada colección de herramientas para análisis de datos, 4) posibilidades gráficas para análisis de datos que funcionan directamente sobre pantalla o impresora, y 5) un lenguaje de programación bien desarrollado, simple y efectivo, que incluye condicionales, ciclos, funciones recursivas y posibilidad de entradas y salidas.

Variables, operaciones, operadores lógicos y clases de datos

Tipos de variables

Primero asignemos un valor a una variable xx. Este valor puede ser un número, pero también puede ser un conjunto de caracteres, variables categóricas (o factores), booleanas (lógicas: verdadero o falso) y fechas. Esto puede verse en los siguientes ejemplos:

# Números
x <- 10
print(x)
## [1] 10
# Caracteres
x <- "Economia"
print(x)
## [1] "Economia"
# Categóricas
x <- factor(c(10,11))
print(x)
## [1] 10 11
## Levels: 10 11
# Booleanas
x <- FALSE
print(x)
## [1] FALSE
# Fechas
x <- as.Date("08/08/2018", "%m/%d/%Y")
print(x)
## [1] "2018-08-08"

Nota que la asignación de valores se expresa mediante el símbolo <-, aunque el signo = también funciona. Nota, además, que hemos usado el comando print(x) para ver si el código funciona correctamente.

Las variales en R también pueden tener más de un valor. Por ejemplo, construimos un vector llamado votantes que se conforma de una secuencia de números del mismo tipo:

votantes <- c(134, 542, 324, 102, 402, 383, 853)
print(votantes)
## [1] 134 542 324 102 402 383 853

Supongamos que cada elemento del vector votantes representa el número de votantes en una casilla electoral. Deseamos, por ejemplo: 1) calcular el número total de votantes en la elección, 2) el número de casillas electorales, 3) imprimir un mensaje que resuma la información obtenida. Lo anterior podemos lograrlo con las funciones: sum(), length() y paste(), respectivamente.

no_votantes <- sum(votantes)
no_casillas <- length(votantes)
texto1 <- "El número total de votantes es:"
texto2 <- "en un total de:"
texto3 <- "casillas electorales"
mensaje <- paste(texto1, no_votantes, texto2, no_casillas, texto3)
print(mensaje)
## [1] "El número total de votantes es: 2740 en un total de: 7 casillas electorales"

Operaciones con números

R puede utilizarse al estilo de una calculadora. Es decir, los valores numéricos pueden moficarse o manipularse mediante los operadores aritméticos clásicos: suma (+), resta (-), multiplicación (*), división (/), potencia (**) y módulo (%%).

x <- 10

# Suma
x <- x+5
print(x)
## [1] 15
# Resta
x <- x-8
print(x)
## [1] 7
# Multiplicación
x <- x*4
print(x)
## [1] 28
# División
x <- x/14
print(x)
## [1] 2
# Potencia
x <- x**2
print(x)
## [1] 4
# Módulo
mod1 <- 10%%10
mod2 <- 20%%10
mod3 <- 10%%20
mod4 <- 2%%8
print(c(mod1,mod2, mod3, mod4))
## [1]  0  0 10  2

Estas operaciones también se aplican a los vectores. Si, por ejemplo, multiplicamos por 2 el vector votantes, cada elemento de este vector se multiplicará por 2.

# Multiplicación
votantes_doble <- votantes*2
print(votantes_doble)
## [1]  268 1084  648  204  804  766 1706
# División
votantes_mitad <- votantes/2
print(votantes_mitad)
## [1]  67.0 271.0 162.0  51.0 201.0 191.5 426.5

Operadores lógicos

Los valores lógicos son particularmente útiles para clasificar datos de acuerdo a valores o umbrales específicos. El resultado de una operación lógica es un valor booleano. Las operaciones pueden aplicarse también a vectores.

x <- 10
y <- 2

# Desigualdad estricta
resultado <- x > y
print(resultado)
## [1] TRUE
# Desigualdad
resultado <- x >= y
print(resultado)
## [1] TRUE
# Igualdad
resultado <- x == y
print(resultado)
## [1] FALSE
# Negación
resultado <- x != y
print(resultado)
## [1] TRUE
casillas_200 <- votantes>200
table(casillas_200)
## casillas_200
## FALSE  TRUE 
##     2     5

Nota que en la última operación hemos utilizado el comando table() para el número de registros verdaderos y el número de falsos. Este comando sirve para dar el número de registros diferentes en un vector o matriz de datos.

Clases de datos

Los vectores que hemos visto antes son solo una de las clases de datos que admite R. Pero existen otras clases. Las clases más importantes son, aparte de los vectores, las matrices, las listas y los data frames.

Las matrices pueden construirse a partir de vectores. Recuerda que los vectores son secuencias de números del mismo tipo. Considera el siguiente ejemplo, en el que un vector contiene caracteres y dos contienen números. La matriz en la última línea se construye utilizando el comando cbind().

cities <- c("Guadalajara","León","Aguascalientes","San Luis Potosí","Irapuato", "San Miguel de Allende")
pop <- c(1600940, 1278087, 723043, 730950, 463103, 139297)
area <- c(187.9, 1219.67, 385, 385, 845.2, 1559)
mat <- cbind(cities, pop, area)
print(mat)
##      cities                  pop       area     
## [1,] "Guadalajara"           "1600940" "187.9"  
## [2,] "León"                  "1278087" "1219.67"
## [3,] "Aguascalientes"        "723043"  "385"    
## [4,] "San Luis Potosí"       "730950"  "385"    
## [5,] "Irapuato"              "463103"  "845.2"  
## [6,] "San Miguel de Allende" "139297"  "1559"

Todos los vectores y matrices están indizados, por lo que podemos buscar elementos dentro de estos. Algunos ejemplos son los siguientes:

# Primer elemento del vector cities
cities1 <- cities[1]
print(cities1)
## [1] "Guadalajara"
# Elementos 1 y 4 del vector cities
cities2 <- cities[c(1,4)]
print(cities2)
## [1] "Guadalajara"     "San Luis Potosí"
# Elementos del 1 al 3 del vector cities
cities3 <- cities[1:3]
print(cities3)
## [1] "Guadalajara"    "León"           "Aguascalientes"
# Elemento (2,1) de la matriz mat
mat1 <- mat[2,1]
print(mat1)
## cities 
## "León"
# 2 y 3 filas y 1 y 3 columnas de la matriz mat
mat2 <- mat[2:3, c(1,3)]
print(mat2)
##      cities           area     
## [1,] "León"           "1219.67"
## [2,] "Aguascalientes" "385"
# Primera columna de la matriz mat
mat3 <- mat[,1]
print(mat3)
## [1] "Guadalajara"           "León"                  "Aguascalientes"       
## [4] "San Luis Potosí"       "Irapuato"              "San Miguel de Allende"
# Tercera fila de la matriz mat
mat4 <- mat[3,]
print(mat4)
##           cities              pop             area 
## "Aguascalientes"         "723043"            "385"

Los vectores (y matrices) pueden ser transformados en data frames. Estos resultan muy útiles dado que permiten fijar y modificar los nombres de las variables que los conforman. Esta característica no está disponible para las matrices. Por ejemplo, el data frame de abajo se crea a partir de los vectores cities, pop y area, a la vez que modificamos los nombres de las variables:

df <- data.frame(city=cities, population = pop, area=area)
print(df)
##                    city population    area
## 1           Guadalajara    1600940  187.90
## 2                  León    1278087 1219.67
## 3        Aguascalientes     723043  385.00
## 4       San Luis Potosí     730950  385.00
## 5              Irapuato     463103  845.20
## 6 San Miguel de Allende     139297 1559.00

Si deseamos modificar nuevamente los nombres de las variables, no es necesario volver a crear el data frame df. Podemos obtener el nombre de las variables mediante el comando colnames(). Dado que los nombres no son más que elementos de un vector, basta con modificar el valor de sus elementos. Por ejemplo:

colnames(df) <- c("Ciudad", "Poblacion", "Área")
print(df)
##                  Ciudad Poblacion    Área
## 1           Guadalajara   1600940  187.90
## 2                  León   1278087 1219.67
## 3        Aguascalientes    723043  385.00
## 4       San Luis Potosí    730950  385.00
## 5              Irapuato    463103  845.20
## 6 San Miguel de Allende    139297 1559.00

Con los data frames, es posible obtener las columnas utilizando el operador $. Por ejemplo, la columna correspondiente a las ciudades se obtiene:

df$Ciudad
## [1] "Guadalajara"           "León"                  "Aguascalientes"       
## [4] "San Luis Potosí"       "Irapuato"              "San Miguel de Allende"

El operador $ también nos permite agregar columnas al data frame. Por ejemplo, deseamos construir una nueva variable booleana que indique cuáles son las ciudades con una población mayor a 2500000. Esta nueva variable, que llamaremos CiudadGrande será agregada al data_frame `df:

df$CiudadGrande <- df$Poblacion > 1000000
print(df)
##                  Ciudad Poblacion    Área CiudadGrande
## 1           Guadalajara   1600940  187.90         TRUE
## 2                  León   1278087 1219.67         TRUE
## 3        Aguascalientes    723043  385.00        FALSE
## 4       San Luis Potosí    730950  385.00        FALSE
## 5              Irapuato    463103  845.20        FALSE
## 6 San Miguel de Allende    139297 1559.00        FALSE

Librerías

R viene precargado con varios paquetes que nos permiten realizar varias funciones relativamente simples como las descritas arriba. Sin embargo, existen muchos más paquetes que pueden ser descargados y utilizados para aumentar la potencia y simplificar muchas tareas. Estos paquetes pueden instalarse usando el comando install.packages(). Una vez instalados los paquetes (que se hace solo una vez y para siempre), tenemos que indicarle a R que deseamos usarlos durante la sesión activa. Para esto utilizamos el comando library().

Para hacer una demostración de lo anterior, aquí instalaremos y utilizaremos los paquetes stargazer, ggplot2 y leaflet. El primero es una librería que nos permite hacer tablas en diferentes formatos: texto, html y Latex. El segundo nos permite aumentar las capacidades gráficas de R. El tercero nos permite hacer mapas interactivos. Utilizaremos la base de datos anterior sobre las ciudades de México, pero agregaremos información sobre sus coordenadas geográficas.

# install.packages("stargazer")
# install.packages("ggplot2")
# install.packages("leaflet")
library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
library(ggplot2)
library(leaflet)

df$Latitud <- c(20.6736, 21.1236, 21.8818, 22.2021, 20.6833, 20.9)
df$Longitud <- c(-103.34420,-101.6821, -102.291, -101.0542, -101.35,-101.4833)
print(df)
##                  Ciudad Poblacion    Área CiudadGrande Latitud  Longitud
## 1           Guadalajara   1600940  187.90         TRUE 20.6736 -103.3442
## 2                  León   1278087 1219.67         TRUE 21.1236 -101.6821
## 3        Aguascalientes    723043  385.00        FALSE 21.8818 -102.2910
## 4       San Luis Potosí    730950  385.00        FALSE 22.2021 -101.0542
## 5              Irapuato    463103  845.20        FALSE 20.6833 -101.3500
## 6 San Miguel de Allende    139297 1559.00        FALSE 20.9000 -101.4833

Ahora haremos unta tabla que muestre un resumen de la información. El formato de salida será de texto para efectos de este ejemplo, pero recuerda que podemos elegir otros formatos. Intenta, por tu cuenta, cambiar la opción text por la opción latex.

stargazer(df, type="text")
## 
## ==============================================================================
## Statistic    N    Mean      St. Dev.     Min    Pctl(25)  Pctl(75)      Max   
## ------------------------------------------------------------------------------
## Poblacion    6 822,570.000 534,365.800 139,297  528,088  1,141,303.0 1,600,940
## Área         6   763.628     541.373   187.900  385.000   1,126.052  1,559.000
## CiudadGrande 6    0.333       0.516       0        0         0.8         1    
## Latitud      6   21.244       0.648     20.674   20.737    21.692     22.202  
## Longitud     6  -101.867      0.833    -103.344 -102.139  -101.383   -101.054 
## ------------------------------------------------------------------------------

Ahora crearemos un mapa interactivo que nos mostrará la posición geográfica de las ciudades que hemos elegido. La posición será indicada con un círculo, cuyo tamaño dependerá del número de habitantes. Dado que este no es un curso de ggplot2 ni de leaflet, no debes preocuparte si no comprendes todo el código.

leaflet(df) %>%
  addTiles() %>%
  addCircles(lng=~Longitud, lat=~Latitud, weight=1,
             radius =~sqrt(Poblacion)*30, popup=~Ciudad)

Dado que este mapa es interactivo, puedes acercar o alejar el mapa según lo desees.

Última actualización: 02-09-2020.