Curso R 2021
2021-06-01
1 Semana I
1.1 Tipos de datos y objetos en R
Estos tipos de datos, o modos, definen cómo se almacenan los valores en la computadora. Puede obtener el modo de un objeto usando la función typeof (). Tenga en cuenta que R también tiene una función mode () incorporada que servirá para el mismo propósito con la única excepción de que no distinguirá enteros de dobles.
R reconoce una variedad de tipos de datos, estos tipos de datos, definen cómo se almacenan los valores en la computadora. Los tipos de datos son estructurados en diferentes objetos o estructuras de datos, los tipos de datos que R reconoce son los siguientes:
Tipo de Dato | Descripción |
---|---|
numeric | Números con decimales |
integer | Números enteros |
character | Cadenas de texto |
Complex | Números complejos |
logical | valores lógicos, TRUE o FALSE |
1.1.1 Crear variables
Para crear una variable de cualquiera de los tipos que se mencionó previamente se usa el comando concatenar, su sintaxis es la siguiente
<-c(1) x
La instrucción anterior crea una variable de tipo numerico, la función class()
me permite verificar el tipo de dato
class(x)
## [1] "numeric"
A continuación vamos a estudiar los principales objetos en R
1.1.2 Vectores
Son considerados como el objeto más básico en R, todos los elementos que componen un vector deben ser del mismo tipo, para crear un vector usarmos la función concatenar c()
separando cada elemento por una coma, por ejemplo:
<-c(1,2,3)
x x
## [1] 1 2 3
Hemos creado un vector de tamaño 3 con los elementos 1, 2 y 3, podemos verificar su tipo mediante class()
class(x)
## [1] "numeric"
y notamos que es un vector de tipo numérico, también observemos que ya antes habiamos definido la variable x y perfectamente pudimos hacer una reasignación a esta variable, es decir, x pierde la información que tenia antes para guardar la nueva información.
Los vectores de tipo character
son creados de la forma:
<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres nombres
## [1] "Carlos" "Maria" "Daniel" "Jorge" "Luisa"
class(nombres)
## [1] "character"
Veamos que sucede si en un mismo vector colocamos diferentes tipos de datos
<-c(45,"Carlos",TRUE)
mezcla mezcla
## [1] "45" "Carlos" "TRUE"
class(mezcla)
## [1] "character"
1.1.2.1 Secuencias
En R podemos crear secuencias de números indicando en que valor empezar, en que valor terminar y el salto. La primera forma de crear secuencia es indicar el valor inicial :
valor final:
<-c(1:10)
secuencia secuencia
## [1] 1 2 3 4 5 6 7 8 9 10
Hemos indicado crear una secuencia partiendo del número 1 y terminando en el 10, por defecto R asume que el salto debe hacerlo de uno en uno. Podemos personalizar mas las secuencias mediante la función seq
, los parámetros de la función son from
indica de que valor parte la secuencia, to
indica hasa que valor termina la secuencia y by
indica el salto de la secuencia
<-seq(from=1,to=10,by=2)
secuencia secuencia
## [1] 1 3 5 7 9
Los nombres de los parámetros pueden omitirse y obtenemos el mismo resultado
<-seq(1,10,2)
secuencia secuencia
## [1] 1 3 5 7 9
Otra forma de crear secuencias es indicar de donde partir hasta donde llegar y la longitud de la secuencia mediante el parámetro length
<-seq(from=1,to=10,length = 5)
secuencia1 secuencia1
## [1] 1.00 3.25 5.50 7.75 10.00
<-seq(from=1,to=10,length = 20)
secuencia2 secuencia2
## [1] 1.000000 1.473684 1.947368 2.421053 2.894737 3.368421 3.842105
## [8] 4.315789 4.789474 5.263158 5.736842 6.210526 6.684211 7.157895
## [15] 7.631579 8.105263 8.578947 9.052632 9.526316 10.000000
1.1.2.2 Acceder a valores de un vector
Nos va a interesar poder acceder, manipular, borrar o agregar entradas a un vector, para acceder a un valor especifico o varios valores en especifico, debemos indicarlo colocando el nombre del vector y entre corchetes el valor al que queremos acceder.
Por ejemplo, queremos acceder al 4 elemento del vector nombres, la forma de hacer esto es la siguiente:
<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres nombres
## [1] "Carlos" "Maria" "Daniel" "Jorge" "Luisa"
4] nombres[
## [1] "Jorge"
Podemos acceder a varios valores, por ejemplo si estos son consecutivos lo hacemos con `:
, si queremos acceder a los nombres 2, 3 y 4 lo hacemos de la forma:
2:4] nombres[
## [1] "Maria" "Daniel" "Jorge"
Si estos valors no son consecutivos indicamos el vector de posiciones al que queremos acceder, por ejemplo a los nombres 1,3 y 5, lo hacemos así.
c(1,3,5)] nombres[
## [1] "Carlos" "Daniel" "Luisa"
Si lo que queremos es eliminar algún valor lo hacemos colocando el simbolo -
antes de el valor o valores que queremos eliminar, a continuación eliminamos el nombre 1 y 2.
-c(1,3)] nombres[
## [1] "Maria" "Jorge" "Luisa"
Notemos que no hemos guardado la instrucción anterior en una variable, por tanto el vector nombres sigue siendo el mismo
nombres
## [1] "Carlos" "Maria" "Daniel" "Jorge" "Luisa"
Si lo que queremos es eliminar definitivamente los nombres 1 y 3 debemos asignar la instrucción de borrar en el vector nombres o en un nuevo vector si queremos conservar el original.
<-nombres[-c(1,3)]
nombres nombres
## [1] "Maria" "Jorge" "Luisa"
Si queremos agregar un numevo nombre o varios nombres nuevos, solo debemos concatenar al vector anterior el nuevo vector, queremos agregar los nombres Alejandra y Manuel, lo hacemos de la siguiente forma:
<-c(nombres,"Alejandra","Manuel")
nombres nombres
## [1] "Maria" "Jorge" "Luisa" "Alejandra" "Manuel"
1.1.2.3 Operaciones con vectores
En R podemos hacer las operaciones aritmeticas básicas: adución sustracción, multiplicación y división. La mayoría de las funciones en R están vectorizadas, lo que significa que la función operará sobre todos los elementos de un vector sin necesidad de recorrer cada elemento y actuar sobre cada uno de ellos. Esto hace la escritura de código más concisa, fácil de leer y menos propenso a errores.
<-c(1,6,9,3)
x<-c(5,2,4,7)
y+y x
## [1] 6 8 13 10
-y x
## [1] -4 4 5 -4
*y x
## [1] 5 12 36 21
/y x
## [1] 0.2000000 3.0000000 2.2500000 0.4285714
Notemos que cara operación la realiza elemento a elemento, incluyendo la división, también podemos sumar, restar, multiplicar y dividir constantes a un vector, y lo que esto hace es que aplica la operación a cada elemento
<-c(2,7,5)
x+10 x
## [1] 12 17 15
/5 x
## [1] 0.4 1.4 1.0
2*x
## [1] 4 14 10
5/x
## [1] 2.5000000 0.7142857 1.0000000
Algunas otras funciones que son aplicables a vectores son:
sum
suma los elementos de un vectorprod
hace el producto de los elementos del vectrolength
devuelve el número de elementos que tiene el vectormean
devuelve el promedio de los elementos del vector
sum(x)
## [1] 14
prod(x)
## [1] 70
length(x)
## [1] 3
mean(x)
## [1] 4.666667
1.1.3 Matrices
Las matrices son otra forma de almacenar valores, son estructuras bidimensionales, que poseen filas y columnas de valores, todos los valores dentro de una matriz, al igual que en un vector, deben ser del mismo tipo, todos numericos, todos caracteres, todos lógicos etc…
Para crear una matriz usamos la función matrix
, idicamos los valores que debe contener la matriz, si no definimos filas y columnas por defecto las matrices son vectores columna
<-matrix(c(1,2,3,4,5,6)) matriz
Si queremos indicar número de filas agregamos nrow
y número de columnas con ncol
, la siguiente instrucción crea una matriz de dos filas con 3 columnas
<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3)
matriz matriz
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Notemos que por defecto R toma las entradas de los datos como las columnas de la matriz, es decir, en este caso como tenemos 3 columnas y dos filas, cada columna tiene dos elementos y los toma de dos en dos del vector de datos para formar la matriz, si queremos cambiar esto, es decir que tome los valores por fila, debemos agregar el parámetro byrow=T
<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3,byrow = T)
matriz matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
1.1.3.1 Acceder a los valores de una matriz
Para acceder a los valores de matrices lo hacemos indicando la fila y columna correspondiente al valor, por ejemplo si queremos acceder al elemento de la fila 2 en la columna 3 de el último ejemplo lo hacemos así:
<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3,byrow = T)
matriz matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
2,3] matriz[
## [1] 6
Siempre indicamos primero la fila y luego la columna, si queremos acceder a una fila completa lo hacemos indicando el número de fila, dejando vacio el espacio de la columna y si lo que queremos es una columna, lo hacemos indicando la columna, dejando en blanco la fila. A continuación vamos a acceder a la segunda columna y luego a la sefunda fila de la matriz
matriz
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
2] # segunda columna matriz[,
## [1] 2 5
2,] # segunda fila matriz[
## [1] 4 5 6
1.1.3.2 Operaciones con matrices
A igual que en los vectores, las operciones aritmeticas se realizan elemento a elemento de las matrices, por tanto, debemos asegurarnos que ambas tengan la misma cantidad de filas y columnas.
En este caso debemos tener cuidado ya que el operador *
no realizará la multiplicación de matrices usual, el resultado que se obtiene es la multiplicación elemento a elemento, y /
dividira elemento a elemento, algo que algebrá de matrices no está definido. Veamos algunos ejemplos:
<-matrix(c(1:4),ncol = 2,nrow = 2)
A<-matrix(c(5:8),ncol = 2,nrow = 2)
B A
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
B
## [,1] [,2]
## [1,] 5 7
## [2,] 6 8
+B A
## [,1] [,2]
## [1,] 6 10
## [2,] 8 12
-B A
## [,1] [,2]
## [1,] -4 -4
## [2,] -4 -4
*B A
## [,1] [,2]
## [1,] 5 21
## [2,] 12 32
/B A
## [,1] [,2]
## [1,] 0.2000000 0.4285714
## [2,] 0.3333333 0.5000000
2*A
## [,1] [,2]
## [1,] 2 6
## [2,] 4 8
3/B
## [,1] [,2]
## [1,] 0.6 0.4285714
## [2,] 0.5 0.3750000
+10 A
## [,1] [,2]
## [1,] 11 13
## [2,] 12 14
^2 A
## [,1] [,2]
## [1,] 1 9
## [2,] 4 16
1.1.3.3 Paquete matlib
Si queremos realizar operaciones con matrices, como la multiplicación, inversas, traspuestas, etc,… Debemos hacer uso del paquete matlib, primero debemos instalar el paquete y luego cargarlo para poder usarlo.
install.packages("matlib")
library(matlib)
Dentro del paquete matlib
tenemos las siguientes funciones y operaciones:
%*%
Operador de producto de matricesDet
Determinante de una matriztr
Traza de una matrizinv
Inversa de una matriz
Y muchas más, veamos los ejemplos:
%*%B A
## [,1] [,2]
## [1,] 23 31
## [2,] 34 46
Det(B)
## [1] -2
tr(A)
## [1] 5
inv(A)
## [,1] [,2]
## [1,] -2 1.5
## [2,] 1 -0.5
inv(A)%*%A
## [,1] [,2]
## [1,] 1 0
## [2,] 0 1
1.1.4 Listas
A diferencia de las estructuras anteriores, vectores y matrices, una lista es una colección de elementos de diferente tipo, es decir, que un elemento puede ser un número, otro un caracter, otro un vector, otro una matriz, incluso puede tener otra lista, para crear una lista usamos la función list
indicando sus elementos separados por coma, veamos un ejemplo.
<-c(45)
x<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres<-matrix(c(1:4),ncol = 2,nrow = 2)
A<-list(x,nombres,A)
lista lista
## [[1]]
## [1] 45
##
## [[2]]
## [1] "Carlos" "Maria" "Daniel" "Jorge" "Luisa"
##
## [[3]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
Acabamos de crear una lista con 3 elementos, un número, un vector de nombres y una matriz, la función str
nos indica la estructura de la lista especificando el tipo de dato que es cada entrada
str(lista)
## List of 3
## $ : num 45
## $ : chr [1:5] "Carlos" "Maria" "Daniel" "Jorge" ...
## $ : int [1:2, 1:2] 1 2 3 4
Ahora si queremos acceder a un elemento especifico de una lista lo hacemos con [[]]
indicando el número del elemento al que queremos acceder, por ejemplo, si queremos acceder el segundo elemento de la lista lo hacemos de la forma:
2]] lista[[
## [1] "Carlos" "Maria" "Daniel" "Jorge" "Luisa"
Las listas son estructuras muy útiles cuando trabajamos con funciones y queremos retornar mas de un valor a la vez.
1.1.5 Data frames
Un data frame es una estructura de datos bidimensional similar a una matriz, pero funciona de manera muy diferente. Si bien un data frame parece una tabla simple, de hecho es una lista de vectores de la misma longitud. Para los nuevos usuarios de R, las matrices y los data frames parecen similares. La principal diferencia es que un data frame permite tipos de datos mixtos (por ejemplo, numérico, lógico, caracter). Esto les permite almacenar diferentes tipos de variables, lo cual es muy útil en el análisis estadístico.
Para crear un data frame usamos la función data.frame
por ejemplo:
<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres<-c(12,34,21,24,44)
edades<-c("M","F","M","M","F") genero
Notemos que tenemos tres vectores de la misma dimensión, 5, uno indica nombres(caracter), el otro edades(números) y un último el género(caracteres), la estructura de datos más adecuada para almacenar toda esta información es unn data frame, ya que este me permitirá mantener los tipos de datos.
<-data.frame(nombres,edades,genero)
datos datos
## nombres edades genero
## 1 Carlos 12 M
## 2 Maria 34 F
## 3 Daniel 21 M
## 4 Jorge 24 M
## 5 Luisa 44 F
Observemos el resultado, si se tratara de una encuesta, cada fila indicaría la información de cada individuo, mientras que cada columna una variable, con `str
podemos verificar que, en efecto, el tipo de dato de cada columna se mantuvo intacto.
str(datos)
## 'data.frame': 5 obs. of 3 variables:
## $ nombres: chr "Carlos" "Maria" "Daniel" "Jorge" ...
## $ edades : num 12 34 21 24 44
## $ genero : chr "M" "F" "M" "M" ...
1.1.5.1 Factores
Notemos la variable genero
esta variable originalmente está siendo tratada como caracter, de los cursos básicos de estadística sabemos que la variable genero
es una variable del tipo cualitativa o categórica, este tipo de variables son aquellas que toman un conjunto fijo y conocido de valores posibles, en R este tipo de variables se llaman factores y es convenienete tratarlos como tales.
Por ejemplo, suponga que una variable es estado civil, esta varible tomará los valores de soltero, casado y divorciado, cada una de estas categorias llevara una codificación numérica, puede ser: 0: soltero, 1: casado, 2:divorciado, y a las palabras, soltero, casado y divorciado se le llaman etiquetas. Para crear un factor lo hacemos con factor
indicando los valores y opcionalmente etiquetas y valores.
<-factor(c(1,2,3,1,1),levels = c(1,2,3),labels = c("Soltero","Casado","Divorciado") ) estCivil
Ahora podemos crear nuestro data frame agregando este nuevo factor
<-data.frame(nombres,edades,genero,estCivil)
datos datos
## nombres edades genero estCivil
## 1 Carlos 12 M Soltero
## 2 Maria 34 F Casado
## 3 Daniel 21 M Divorciado
## 4 Jorge 24 M Soltero
## 5 Luisa 44 F Soltero
str(datos)
## 'data.frame': 5 obs. of 4 variables:
## $ nombres : chr "Carlos" "Maria" "Daniel" "Jorge" ...
## $ edades : num 12 34 21 24 44
## $ genero : chr "M" "F" "M" "M" ...
## $ estCivil: Factor w/ 3 levels "Soltero","Casado",..: 1 2 3 1 1
1.1.5.2 Conversión de datos
Algunas veces vamos a querer convertir datos de un tipo en otro, por ejemplo, convertir un vector de números en caracteres o viceversa, en caso de que sea posible. Por ejemplo si tenemos un vector de caracteres numericos y queremos convertirlos a numérico lo hacemos así:
<-c("3","6","45")
numeros numeros
## [1] "3" "6" "45"
class(numeros)
## [1] "character"
<-as.numeric(numeros)
numeros numeros
## [1] 3 6 45
class(numeros)
## [1] "numeric"
También podemos convertir a factores, por ejemplo, si queremos convertir la variable genero
que es de tipo caracter a factor con dos niveles. De hecho podemos hacer esta conversión adentro de la misma variable, veamos:
str(genero)
## chr [1:5] "M" "F" "M" "M" "F"
<-as.factor(genero)
generostr(genero)
## Factor w/ 2 levels "F","M": 2 1 2 2 1
Recordemos que el hecho de haber convertido genero
a factor no significa que en el data frame datos también se haya cambiado.
str(datos)
## 'data.frame': 5 obs. of 4 variables:
## $ nombres : chr "Carlos" "Maria" "Daniel" "Jorge" ...
## $ edades : num 12 34 21 24 44
## $ genero : chr "M" "F" "M" "M" ...
## $ estCivil: Factor w/ 3 levels "Soltero","Casado",..: 1 2 3 1 1
<-data.frame(nombres,edades,genero,estCivil)
datos datos
## nombres edades genero estCivil
## 1 Carlos 12 M Soltero
## 2 Maria 34 F Casado
## 3 Daniel 21 M Divorciado
## 4 Jorge 24 M Soltero
## 5 Luisa 44 F Soltero
str(datos)
## 'data.frame': 5 obs. of 4 variables:
## $ nombres : chr "Carlos" "Maria" "Daniel" "Jorge" ...
## $ edades : num 12 34 21 24 44
## $ genero : Factor w/ 2 levels "F","M": 2 1 2 2 1
## $ estCivil: Factor w/ 3 levels "Soltero","Casado",..: 1 2 3 1 1
1.2 Práctica en clase
Use R para calcular \[ \frac{1+2\cdot 3^4}{\frac{5}{6}-7} \]
Considere el conjunto de datos 2, 5, 4, 10, 8
- Guarde esta data en un vector con nombre x
- Encuentre el cuadrado de cada número
- Restele 6 a cada número
- Restele 9 a cada numero y luego eleve al cuadrado la respuesta (en una sola linea de código)
Almacene los siguientes conjuntos de datos en un vector, utilizando
:
oseq
- 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10
- 1, 8, 27, 64, 125, 216
- 0, 25, 50, 75, …, 1000 (de 0 a 1000 de 25 en 25)
La distancia promedio desde el centro se calcula mediante \((\vert x_1 -\bar{x}\vert + \vert x_2 -\bar{x}\vert + \cdots +\vert x_n -\bar{x}\vert )/n\), donde \(\bar{x}\) es la media del vector de datos. Calcule esto para el conjunto de datos
rivers
de usando la función suma para sumar los valores y abs para encontrar el valor absoluto.