Introducción a R
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 . 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.