Breve Intro A R
Breve Intro A R
Inferencia
UTDT – 2022
Este tutorial tiene como objetivo presentar las principales características de R; al final del mismo dejamos
una hoja resumen de los principales comandos que aquí discutimos y que serán de utilidad a lo largo del curso.
Estamos convencidos que la única forma de aprender a programar (en cualquier lenguaje) es programando; y
es por esto que te recomendamos que intentes realizar los ejercicios propuestos en este documento.
Si quieras revisar más material con explicaciones formales, puede por ejemplo recurrir al tutorial “R para
principiantes” (disponible online en tanto en español como en inglés). Existen muchas referencias sobre R a
nivel introductorio, intermedio y avanzado, si quieres o precisas más, ponte en contacto con los docentes del
curso.
Tipos de datos en R
Como vimos en la primera sesión, R funciona como una ‘calculadora’ donde podemos almacenar información.
Cuando trabajemos en R, en general vamos a importar bases de datos externas, y con los datos en la memoria
de R vamos a correr diferentes ‘modelos’ con los que resolvemos problemas de índole práctica. Antes de llegar
a este punto, necesitamos entender que tipos de datos y que estructuras de datos soporta R; y aprender a
manipular la información dentro de R.
A grandes rasgos, en la memoria de R podemos almacenar 5 tipos de datos:
# 1) Lógicos (asumen los valores TRUE y FALSE):
l <- TRUE
print(class(l))
## [1] "logical"
# 2) Numéricos (números reales):
n <- 23.5187
print(class(n))
## [1] "numeric"
# 3) Enteros (números naturales).
e <- 1L
print(class(e))
## [1] "integer"
1
# 4) Complejos (números complejos)
d <- 3 - 2i
print(class(d))
## [1] "complex"
# 5) Caracteres (letras o cadenas de caracteres):
ca <- 'machine learning'
print(class(ca))
## [1] "character"
Los datos en la memoria de R se almacenan en diferentes estructuras. Dichas estructuras dependerán de la
dimensión de los datos y de los tipos de datos con los que trabajes. La siguiente figura intenta resumir estas
estructuras atendiendo a estos dos factores:
Por Homogeneos entendemos datos del mismo tipo (por ejemplo todos numéricos), y por Heterogéneos
lo contrario (algunos datos numéricos, otros categóricos). En general en ML (y también en Econometría,
Estadística, etc), algunas variables son numéricas y otras categóricas; por tanto en este curso utilizaremos
con mayor frecuencia la estructura data–frame. Más adelante discutiremos como importar datos externos
(fuera de R) a objetos como los descritos en la figura anterior. Ahora discutiremos como crear y manipular
datos en diferentes estructuras dentro de R.
2
## [1] 1 2 3
sem <- c('lunes','martes','miércoles','jueves','viernes')
print(sem)
## [1] 3 5 7
xˆ2 # Cuadrado de todos los elementos de x.
## [1] 1 4 9
sqrt(x) # Raíz de todos los elementos de x.
## [1] 4 5 6 7 8 9
z = c(x,y)
print(z)
## [1] 1 2 3 4 5 6 7 8 9
Cuando las operaciones que hacemos son incoherentes, el programa nos lanza un mensaje de error que nos
advierte de la incoherencia de nuestra solicitud. Veamos que ocurre, por ejemplo, si intentamos multiplicar
un vector con caracteres:
2*sem
3
## [7] "jueves" "viernes"
# R transforma los elementos numéricos en texto para que la operación se pueda realizar.
Existen algunos comandos que resultan de bastante utilidad en la práctica. Por ejemplo el comando lenght()
que me dice cuantos elementos (que dimensión) tiene un vector.
length(x) # x tiene 3 elementos, luego:
## [1] 3
z = 1:10
length(z) # z tiene 10 elementos, luego:
## [1] 10
Ejercicios en clase:
1- Con el comando sum() puedes sumar los elementos de un vector. Crea un vector con los elementos
12 , 22 , . . . , 102 y computa la media y la varianza de los datos dentro del vector (contrasta tus resultados con
los que obtienes utilizando las funciones mean() y var().
2- Crea otro vector con los elementos 21 , 22 , . . . , 210 , y determina comparando contra los elementos del vector
del inciso anterior para que valores de n ∈ {1, 2, . . . , 10} se cumple que: a) 2n < n2 , b) 2n = n2 y c) 2n > n2
(compara los vectores con los operadores “==”, “<” y “>”).
## [1] "a"
z[-1] # Extraemos todos los elementos menos el primer elemento de z.
## [1] 4
4
x = 1:10
which(x<3) # de los elementos de x, cuales son menores a 3
## [1] 1 2
Podemos combinar condiciones de búsqueda usando conectores lógicos: “o” que en R se escribe con el símbolo
“|” e “y” que en R se escribe con el símbolo “&”. Veamos algunos ejemplos:
print(z)
## [1] 1 4
x = -5:5
print(x)
## [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
which(x>1 & x<=3) # De los elementos de x, cuales son mayores a 1 y menores o iguales que 3.
## [1] 8 9
También nos puede interesar modificar algún/algunos valores particulares de un vector. Por ejemplo, quiero
cambiar la vocal ‘u’ (que ocupa la posición 5 dentro del vector z) por la letra ‘m’:
print(z)
## [1] -5 -4 -3 -2 -1 0 1 2 3 4 5
x[which(x>2)] = 2 # De los elementos de x, aquellos que fueran mayor que 2 son truncados en 2.
print(x)
## [1] -5 -4 -3 -2 -1 0 1 2 2 2 2
## [1] -2 -2 2 2
5
ceiling(x) # Redondeo 'hacia arriba'
## [1] -1 -1 3 3
round(x,1) # Redondeo 'a 1 decimal' (este es un parámetro de la función round que puedo cambiar!)
## [1] -1 -1 2 2
También nos puede interesar calcular sumas, sumas acumuladas, valores absolutos, maximos, mínimos u
ordenar los elementos de un vector:
x = c(-1.90,-1.46,2.36,2.92)
print(x)
## [1] 1.92
cumsum(x) # Suma acumulativa de los elementos de x
## [1] 2.92
min(x) # Mínimo
## [1] -1.9
sort(x,decreasing = T) # Ordenamos 'descendentemente' (parámetro de la función!) los elementos de x.
v = c(0,5,-1)
w = c(1/2,-2,7)
print(v) ; print(w)
## [1] 0 5 -1
## [1] 0.5 -2.0 7.0
# Producto interior:
t(v)%*%w # v'*w (notar que esto es diferente de v*w)
6
## [,1]
## [1,] -17
# Normas:
(t(v)%*%v)ˆ0.5
## [,1]
## [1,] 5.09902
(t(w)%*%w)ˆ0.5
## [,1]
## [1,] 7.29726
# Ejercicio: Calcula el ángulo entre los dos vectores del ejemplo.
Las matrices pueden entenderse en R como objetos bi-dimensionales y por lo tanto habrá dos indices para
indicar la posición de cada elemento en este objeto: Uno para indexar a que fila y el otro para indexar a que
columna pertenece el elemento en cuestión. Es importante mencionar que los elementos que almacenamos
dentro de una matriz tienen que ser todos del mismo tipo (esto quiere decir que no podemos tener números y
caracteres al mismo tiempo dentro de una matriz).
El comando ‘matrix’
Con el comando matrix(datos, nrow, ncol, byrow = F) creamos matrices en R
x <- c(1,2,3,4)
matrix(x, ncol = 2, nrow =2, byrow = F) # byrow = F -> reparte los datos en x por columnas.
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
matrix(x, ncol = 2, nrow =2, byrow = T) # byrow = T -> reparte los datos en x por filas.
## [,1] [,2]
## [1,] 1 2
## [2,] 3 4
7
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
A + 2*A # Suma de dos matrices
## [1] 45
max(A) # Devuelve el máximo entre todos los elementos de A
8
## [1] 9
min(A) # Devuelve el mínimo entre todos los elementos de A
## [1] 1
En algunos contextos puede resultar de utilidad aplicar alguna de estas funciones por filas o por columnas
sobre los datos de una matriz. En ese caso utilizamos el comando apply(matriz, ‘margen’, ‘fun’), como ves en
el siguiente ejemplo:
print(A)
## [1] 12 15 18
apply(A,2,min) # Devuelve los mínimos por filas de A.
## [1] 1 4 7
9
Con el comando dim() visualizamos las dimensiones (el m y el n) de una matriz:
C=matrix(c(1:8),ncol=2)
print(C)
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
dim(C) # El primero número indica cantidad de filas y el segundo de columnas.
## [1] 4 2
En algunos contextos necesitamos acceder (o modificar) ciertos elementos de una matriz. Como lo hacemos?
Al igual que con los vectores usamos el operador [], la única diferencia es que ahora necesitamos especificar
tanto las filas como las columnas a las que queremos acceder. Veamos un primer ejemplo:
print(C)
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
C[2,1] # Nos devuelve el elemento que ocupa la posición de la segunda fila y la primera columna.
## [1] 2
Al igual que con los vectores, podemos utilizar de varias maneras el operador:
C[-c(1,4), ] # Quitamos las filas 1 y 4 y nos quedamos con todas las columnas.
## [,1] [,2]
## [1,] 2 6
## [2,] 3 7
Ejercicios:
1- Construye en R la siguientes matrices:
1 2 3 6 5 4
A = 6 5 4 B = 1 2 3
7 8 9 9 8 7
extraer la primera fila de A y la segunda columna de B. Luego verifica (y explica) que resultado obtienes al
aplicar las siguientes funciones:
• c(A)
• A <= 5
• A>B
• t(B)
• diag(A)
• rowSums(B)
• colSums(A)
• apply(A, 1, max)
• apply(A, 2, max)
• apply(B, 1, mean)
10
• apply(B, 2, sd) (sd = comando para calcular la desviación standard de un conjunto de datos)
Data Frames
Los data frames son la estructura de datos que más utilizamos en la práctica. A diferencia de las matrices,
podemos almacenar en ellos elementos de dirente naturaleza (algunas columnas con números y otras con
caracteres). Al igual que las filas y columnas de una matriz, todos los elementos de un data frame deben ser
de la misma longitud. De este modo, pueden usarse funciones tales como dim, apply, rbind, etc, sobre un
data frame como si se tratara de una matriz. Operamos con y accedemos a los elementos de un data frame
de la misma manera que lo hacemos con las matrices. Creemos un data frame de juguete (simulando datos
de pesos, alturas y club de fútbol de algunos estudiantes del curso):
peso <- c(60.1,75.5,82.9,78.5,69.6,50.4)
altura <- c(151,174,181,175,164,141)
club <- c('River','Boca','Racing','Talleres','River','Independiente')
print(Datos)
# Alternativamente:
attach(Datos)
Datos$altura
## Ejercicios:
# 1- Utiliza los comandos: summary(Datos) y table(Datos$club).
# 2- Investiga para sirve el comando **detach()** en R.
En algunos contextos nos interesa trabajar solo con subconjuntos de la información que disponemos dentro
de un data-frame. Por ejemplo, para el data frame que acabamos de crear, nos puede interesar analizar
solamente a los hinchas de River. El comando subset() nos ayuda a realizar este tipo de operaciones de
11
manera simple en R:
Datos.River = subset(Datos, club=='River', select=c(altura,peso) )
print(Datos.River)
## altura peso
## 1 151 60.1
## 5 164 69.6
Por defecto, los datos en formato diferentes a .RData se leen y almacenan internamente en un data frame
(luego puedes reconvertir parte o el total de los datos a otro formato si así lo deseas). Con el comando
\texttt{read.table() puedes leer muchos formatos de datos distintos (.txt, .csv, etc). Si quieres levantar datos
en formatos poco extendidos (ficheros de Stata, EViews, SPSS, etc), R tiene un montón de librerías que te
permiten leer estos datos utilizando una simple línea de comando.
Arrays y Listas
Los arrays son matrices 3-dimensionales (imagina una matriz en 3 dimensiones). Se utilizan bastante poco en
la práctica. Las listas constituyen el concepto más general de almacenamiento de datos, aquí adentro podemos
coleccionar: variables, vectores, matrices y/o data frames (cada objeto de la lista puede ser cualquiera de los
anteriores elementos). Veamos un ejemplo:
MiLista = list(a = 1, x = c(1,2,3), A = matrix(1:4,ncol=2), Datos)
MiLista[1]
## $a
## [1] 1
MiLista[2]
## $x
## [1] 1 2 3
MiLista[3]
## $A
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
MiLista[4]
## [[1]]
## peso altura club
## 1 60.1 151 River
## 2 75.5 174 Boca
## 3 82.9 181 Racing
## 4 78.5 175 Talleres
## 5 69.6 164 River
12
## 6 50.4 141 Independiente
A veces necesitamos acceder a algunos subconjuntos dentro de alguno de los objetos de la lista. Por ejemplo,
supongamos que queremos la segunda columna de la matriz A (que ocupa el tercer lugar en MiLista), luego
usamos dos veces el comando [ ] como sigue:
MiLista[[3]][,2]
## [1] 3 4
Las listas suelen resultar útiles en algunos contextos de programación, pero en general las utilizamos solo
para guardar resultados numéricos de distinto tipo en un solo objeto.
13
Apéndice
14
Figure 3: Funciones básicas para hacer análisis estadístico en R
15
Figure 4: Funciones básicas para programar en R
16