Introducción

Este documento es una introducción al lenguaje de análisis R. Presenta conceptos básicos del lenguaje, así como ejemplos fáciles de reproducir para ir conociendo el potencial de esta herramienta de análisis en data science.

Sintaxis del documento

Las secciones que aparecen enmarcadas en fondo gris, es código de R que pueden copiar y pegar directamente en la consola de R, verificando que el resultado que aquí se presenta es el mismo que ustedes pueden obtener practicando estos ejemplos; las secciones enmarcadas en fondo blanco es el resultado de la(s) instrucciones de R.

En los bloques de código, las líneas que comienzan con el símbolo # son comentarios para ampliar la explicación.

Por ejemplo, para averiguar la fecha y hora, se usa la función:

date()
## [1] "Tue Jan 17 18:06:44 2023"

Aritmética básica en R

En R los números se interpretan directamente y se pueden hacer todas las operaciones aritméticas básicas.

12
## [1] 12
34
## [1] 34
# Adición
37 + 5
## [1] 42
# Sustracción
37 - 5
## [1] 32
# Multiplicación
37 * 5
## [1] 185
# Exponenciación
37 ^ 5
## [1] 69343957
# División real
37 / 5
## [1] 7.4
# División entera
37 %/% 5
## [1] 7
# Módulo (residuo de la división entera)
37 %% 5
## [1] 2

Asignación

Es la operación que permite almacenar un valor, un objeto o el resultado de una función a un símbolo denominado variable. Los tipos básicos son números (numeric), cadenas de caracteres (character) y lógicos (logical).

# Asignamos un valor numérico
cantidad <- 17

Para averiguar el valor de una variable, simplemente se escribe su nombre (IMPORTANTE: En R las mayúsculas y minúsculas deben respetarse).

# Obtenemos el valor almacenado en cantidad
cantidad
## [1] 17
# Asignamos una cadena de caracteres y desplegamos su valor
nombre <- "Arturo"
nombre
## [1] "Arturo"
# Asignamos un valor lógico (los valores lógicos siempre se escriben
# con mayúsculas TRUE / FALSE)
finalizado <- FALSE
finalizado
## [1] FALSE
# Asignamos el resultado de una operación
resultado <- 5 * 4 - 3
resultado
## [1] 17
# Asignamos el resultado de una función
total <- sum(4, 56, 2)
total
## [1] 62
# Asignamos el resultado de una comparación
exito <- 34 < 22
exito
## [1] FALSE
# Intentamos averiguar el valor de una variable que no existe
Exito
## Error in eval(expr, envir, enclos): objet 'Exito' introuvable



Para saber qué tipo de datos contiene una variable, se usa la función typeof(…).

typeof(cantidad)
## [1] "double"
typeof(nombre)
## [1] "character"
typeof(finalizado)
## [1] "logical"
typeof(resultado)
## [1] "double"
typeof(total)
## [1] "double"
typeof(exito)
## [1] "logical"



Para saber de qué tipo es una variable, se usa la función class(…).

class(cantidad)
## [1] "numeric"
class(nombre)
## [1] "character"
class(finalizado)
## [1] "logical"
class(resultado)
## [1] "numeric"
class(total)
## [1] "numeric"
class(exito)
## [1] "logical"

Vectores

Un vector es un conjunto de valores del mismo tipo. Para crear un vector se usa la función c( … ).

# Un vector de valores numéricos
V1 <- c(1,2,5.3,6,-2,4)
V1
## [1]  1.0  2.0  5.3  6.0 -2.0  4.0
typeof(V1)
## [1] "double"
class(V1)
## [1] "numeric"
# Un vector de cadenas de caracteres
V2 <- c("one","two","three")
V2
## [1] "one"   "two"   "three"
typeof(V2)
## [1] "character"
class(V2)
## [1] "character"
# Un vector de valores lógicos
V3 <- c(TRUE,TRUE,TRUE,FALSE,TRUE,FALSE)
V3
## [1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE
typeof(V3)
## [1] "logical"
class(V3)
## [1] "logical"



Para crear vectores numéricos cuyos valores sean una secuencia consecutiva entre dos valores A y B se usa el símbolo : como se muestra en los siguientes ejemplos:

# Secuencia ascendente del 1 al 10
S1 <- 1:10
S1
##  [1]  1  2  3  4  5  6  7  8  9 10
# Secuencia ascendente del 5 al 34
S2 <- 5:34
S2
##  [1]  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
## [26] 30 31 32 33 34
# Secuencia descendente del 17 al 3
S3 <- 17:3
S3
##  [1] 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3

Operaciones con vectores

Una de las fortalezas del lenguaje R es que permite realizar operaciones con vectores de manera muy sencilla, si el lenguaje detecta un vector, tratará de aplicar la operación a todos los elementos del vector y la respuesta será otro vector cuyo tipo depende del resultado de la operación.

# Suma de un valor con otro valor
a <- 5
a
## [1] 5
a + 7
## [1] 12
# Suma de un vector con otro valor
a <- 3:9
a
## [1] 3 4 5 6 7 8 9
a + 7
## [1] 10 11 12 13 14 15 16
# Suma de dos vectores
a <- 3:9
b <- 24:30
a
## [1] 3 4 5 6 7 8 9
b
## [1] 24 25 26 27 28 29 30
a + b
## [1] 27 29 31 33 35 37 39
# Comparar un valor con otro valor
a <- 5
a
## [1] 5
a > 7
## [1] FALSE
# Comparar un vector con un valor
a <- 3:9
a
## [1] 3 4 5 6 7 8 9
a > 7
## [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

Indexación

Indexación es la forma de trabajar con un elemento específico de un vector o con un subvector. Se usan los corchetes cuadrados [] después del nombre del vector para indicar una sola posición o un vector de posiciones. La posición 1 es la posición del primer elemento.

# Vector V con 7 elementos
V <- c("A", "B", "C", "D", "E", "F", "G")
V
## [1] "A" "B" "C" "D" "E" "F" "G"
# El primer elemento de V
V[1]
## [1] "A"
# El quinto elemento de V
V[5]
## [1] "E"

Si se especifica entre los corchetes un vector de posiciones, el resultado es un subvector que solo contiene los valores del vector original en las posiciones indicadas.

# Los tres primeros elementos (usando secuencias)
V[1:3]
## [1] "A" "B" "C"
# Los tres primeros elementos (usando un vector de posiciones)
V[c(1,2,3)]
## [1] "A" "B" "C"
# El primer, tercer y sexto elemento
V[c(1,3,6)]
## [1] "A" "C" "F"

Si para indicar las posiciones el vector es de valores lógicos (verdadero/false), el subvector que se obtiene contendrá únicamente los valores del vector original en cuya posición había un valor verdadero (TRUE).

V[c(FALSE,FALSE,TRUE,FALSE,TRUE,FALSE,FALSE)]
## [1] "C" "E"

Estas características se pueden combinar para hacer ciertos análisis básicos, por ejemplo:

# Supóngase que se tiene un vector con los montos de 10 pagos realizados en pesos
pagos <- c(45,23,567,123,45,14,56,88,100,678)
pagos
##  [1]  45  23 567 123  45  14  56  88 100 678
# Quiero saber que pagos son mayores a 100 pesos
pagos > 100
##  [1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
# Hago un filtro para extraer únicamente los montos de los pagos mayores a 100 pesos
pagos[pagos > 100]
## [1] 567 123 678

Matrices

Una matriz es un conjunto de valores del mismo tipo acomodados en dos dimensiones (filas por columnas). Para crear una matriz se usa la función matrix( … ) especificando la lista de valores y la cantidad de filas y columnas.

# Construir una matriz de 4 filas, 6 columnas, por lo tanto, contendrá 24 elementos
M <- matrix(1:24, nrow=4, ncol=6)
M
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    5    9   13   17   21
## [2,]    2    6   10   14   18   22
## [3,]    3    7   11   15   19   23
## [4,]    4    8   12   16   20   24

La indexación funciona igual que con los vectores, pero es necesario especificar las 2 dimensiones separadas por coma (,); primero se especifica la fila y luego la columna. Aplicando los conceptos anteriores se pueden extraer elementos, vectores o submatrices.

M
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    5    9   13   17   21
## [2,]    2    6   10   14   18   22
## [3,]    3    7   11   15   19   23
## [4,]    4    8   12   16   20   24
# Extraer un valor específico (segunda fila, tercera columna)
M[2,3]
## [1] 10
# Extraer la segunda fila completa (se omite el valor después de la coma)
M[2,]
## [1]  2  6 10 14 18 22
# Extraer la tercera columna completa (se omite el valor antes de la coma)
M[,3]
## [1]  9 10 11 12
# Extraer Una submatrix (las dos primeras filas y de la segunda a la cuarta columna)
M[1:2,2:4]
##      [,1] [,2] [,3]
## [1,]    5    9   13
## [2,]    6   10   14

Listas

Una lista es un conjunto de valores de cualquier tipo. Para crear un vector se usa la función list( … ). El concepto de indexación es similar al de los vectores, pero se usa doble corchete cuadrado [[ ]].

L <- list("París", 34, FALSE)
L
## [[1]]
## [1] "París"
## 
## [[2]]
## [1] 34
## 
## [[3]]
## [1] FALSE
L[[1]]
## [1] "París"

Se puede asignar nombres a los elementos de una lista, para darle un sentido semántico.

L <- list(ciudad="París", edad=34, casado=FALSE)
L
## $ciudad
## [1] "París"
## 
## $edad
## [1] 34
## 
## $casado
## [1] FALSE
# Si los elementos tienen nombre, se puede usar el nombre en vez de la posición
# (el nombre debe escribirse entre comillas dobles **"..."**)
L[[2]]
## [1] 34
L[["edad"]]
## [1] 34
# Otra forma de acceder un elemento con el nombre es usar el símbolo **$** para 
# separar la lista y el elemento
datos <- list(ciudad="París", edad=34, casado=FALSE)
datos
## $ciudad
## [1] "París"
## 
## $edad
## [1] 34
## 
## $casado
## [1] FALSE
datos[[2]]
## [1] 34
datos[["edad"]]
## [1] 34
datos$edad
## [1] 34

Data Frames

Un data frame es una representación de 2 dimnesiones (filas y columnas) de un conjunto de vectores de manera que cada columna es un vector específico y cada renglón es el conjunto de valores en la misma posición de todos los vectores (una observación). Para crear un data frame se la función data.frame( … ).

# Un vector de nombres
nombre <- c("Luis","Karla","Arturo","Sofía","Gabriela")

# Un vector de edades
edad <- c(34,27,50,31,45)

# Un vector de ciudades de residencia
ciudad <- c("París","Londres","México","Londres","Londres")

# Un vector indicando si están casados 
casado <- c(FALSE,FALSE,TRUE,TRUE,FALSE)

# Creamos un data frame
personas <- data.frame(nombre,edad,ciudad,casado)
personas
nombre edad ciudad casado
Luis 34 París FALSE
Karla 27 Londres FALSE
Arturo 50 México TRUE
Sofía 31 Londres TRUE
Gabriela 45 Londres FALSE

Las columnas de un data frame tienen nombres mientras que las filas tienen números, de forma que un data frame representa un conjunto de observaciones (filas) de ciertas variables o atributos o características de interés (columnas) acerca de algo en particular que se está analizando.

En el data frame anterior, por ejemplo, se analizan datos de personas (filas) y de cada persona nos interesa el nombre, la edad, si ciudad de residencia y si está casado (columnas).

La indexación es similar que con las matrices, usando posiciones de filas y columnas, o también usando los nombres de las variables.

# La segunda persona con su tercera característica
personas[2,3]
## [1] "Londres"
# La ciudad de residencia de la segunda persona
personas[2,"ciudad"]
## [1] "Londres"
# Todos los datos de la segunda persona
personas[2,]
nombre edad ciudad casado
2 Karla 27 Londres FALSE
# Todas las ciudades de residencia
personas$ciudad
## [1] "París"   "Londres" "México"  "Londres" "Londres"

Análisis básico con data frames

Como un data frame es un conjunto de vectores, se puede hacer con cada columna o vector cualquier tipo de operación aplicable a un vector.

# El data frame representa a todas las personas y su información
personas
nombre edad ciudad casado
Luis 34 París FALSE
Karla 27 Londres FALSE
Arturo 50 México TRUE
Sofía 31 Londres TRUE
Gabriela 45 Londres FALSE
# Usando el símbolo $ se accede a una columna en particular (vector)
personas$edad
## [1] 34 27 50 31 45
# mean(...) es la función de R para calcular la media aritmética de un vector numérico
mean(personas$edad)
## [1] 37.4
# sd(...) es la función de R para calcular la desviación estándar de un vector numérico
sd(personas$edad)
## [1] 9.710819
# Se comparan las ciudades con "Londres" y obtenemos un vector lógico con TRUE
# si la persona vive e Londres o FALSE en caso contrario
personas$ciudad == "Londres"
## [1] FALSE  TRUE FALSE  TRUE  TRUE
# Se puede usar el resultado anterior para hacer indexación del data frame (recuerde
# que el data frame tiene dos dimensiones por lo tanto debe llegar la coma al final 
# antes del ])
personas[personas$ciudad == "Londres",]
nombre edad ciudad casado
2 Karla 27 Londres FALSE
4 Sofía 31 Londres TRUE
5 Gabriela 45 Londres FALSE
# Se puede obtener un vector del data frame anterior que fue indexado
personas[personas$ciudad == "Londres",]$edad
## [1] 27 31 45
# Se puede obtener cálculos con el vector indexado, obteniendo en este ejemplo la
# media ritmética y desviación estándar de la edad de las personas que viven en Londres
mean(personas[personas$ciudad == "Londres",]$edad)
## [1] 34.33333
sd(personas[personas$ciudad == "Londres",]$edad)
## [1] 9.451631

Factors

Es la representación de una variable nominal. Internamente se almacena un vector de enteros que indican la cantidad total de valores diferentes, junto con un vector de caracteres con las etiquetas mapeadas a los valores enteros. Un factor se crea con la función factor( … ).

# Vector de 15 respuestas tipo nominal (SI/NO)
r <- c("SI","SI","SI","SI","NO","NO","SI","SI","SI","NO","SI","SI","NO","SI","SI")

# Convertirlo a factor
respuestas <- factor(r)
respuestas
##  [1] SI SI SI SI NO NO SI SI SI NO SI SI NO SI SI
## Levels: NO SI
# Al ser una variable nominal, se puede obtener sus estadísticas básicas y 
# el tratamiento estadístico es el correcto
summary(respuestas)
## NO SI 
##  4 11
pie(summary(respuestas))



Un factor ordenado es una representación de una variable ordinal. Un factor ordenado se crea con la función ordered( … ), especificando un vector con el orden correcto de las etiquetas.

# Vector de 15 respuestas tipo ordinal
r <- c("Malo","Bueno","Bueno","Regular","Bueno","Bueno","Regular",
       "Regular","Malo","Malo","Malo","Malo","Regular","Bueno","Malo")

# Convertirlo a factor ordenado
respuestas <- ordered(r, levels=c("Malo", "Regular", "Bueno"))
respuestas
##  [1] Malo    Bueno   Bueno   Regular Bueno   Bueno   Regular Regular Malo   
## [10] Malo    Malo    Malo    Regular Bueno   Malo   
## Levels: Malo < Regular < Bueno
# Al ser una variable ordinal, se puede obtener sus estadísticas básicas y el 
# tratamiento estadístico es el correcto
summary(respuestas)
##    Malo Regular   Bueno 
##       6       4       5
plot(respuestas)

 

Dr. José Luis Barrera-Canto

Consultor en Análisis Estratégico Empresarial

jose.luis.barrera.canto@gmail.com