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

x<-c(1)

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:

x<-c(1,2,3)
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:

nombres<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres
## [1] "Carlos" "Maria"  "Daniel" "Jorge"  "Luisa"
class(nombres)
## [1] "character"

Veamos que sucede si en un mismo vector colocamos diferentes tipos de datos

mezcla<-c(45,"Carlos",TRUE)
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:

secuencia<-c(1:10)
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

secuencia<-seq(from=1,to=10,by=2)
secuencia
## [1] 1 3 5 7 9

Los nombres de los parámetros pueden omitirse y obtenemos el mismo resultado

secuencia<-seq(1,10,2)
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

secuencia1<-seq(from=1,to=10,length = 5)
secuencia1
## [1]  1.00  3.25  5.50  7.75 10.00
secuencia2<-seq(from=1,to=10,length = 20)
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:

nombres<-c("Carlos","Maria","Daniel","Jorge","Luisa")
nombres
## [1] "Carlos" "Maria"  "Daniel" "Jorge"  "Luisa"
nombres[4]
## [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:

nombres[2:4]
## [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í.

nombres[c(1,3,5)]
## [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.

nombres[-c(1,3)]
## [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<-nombres[-c(1,3)]
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:

nombres<-c(nombres,"Alejandra","Manuel")
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.

x<-c(1,6,9,3)
y<-c(5,2,4,7)
x+y
## [1]  6  8 13 10
x-y
## [1] -4  4  5 -4
x*y
## [1]  5 12 36 21
x/y
## [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

x<-c(2,7,5)
x+10
## [1] 12 17 15
x/5
## [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 vector
  • prod hace el producto de los elementos del vectro
  • length devuelve el número de elementos que tiene el vector
  • mean 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

matriz<-matrix(c(1,2,3,4,5,6))

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

matriz<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3)
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

matriz<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3,byrow = T)
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í:

matriz<-matrix(c(1,2,3,4,5,6),nrow = 2,ncol = 3,byrow = T)
matriz
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
matriz[2,3]
## [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
matriz[,2] # segunda columna
## [1] 2 5
matriz[2,] # segunda fila
## [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:

A<-matrix(c(1:4),ncol = 2,nrow = 2)
B<-matrix(c(5:8),ncol = 2,nrow = 2)
A
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
B
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8
A+B
##      [,1] [,2]
## [1,]    6   10
## [2,]    8   12
A-B
##      [,1] [,2]
## [1,]   -4   -4
## [2,]   -4   -4
A*B
##      [,1] [,2]
## [1,]    5   21
## [2,]   12   32
A/B
##           [,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
A+10
##      [,1] [,2]
## [1,]   11   13
## [2,]   12   14
A^2
##      [,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 matrices
  • Det Determinante de una matriz
  • tr Traza de una matriz
  • inv Inversa de una matriz

Y muchas más, veamos los ejemplos:

A%*%B
##      [,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.

x<-c(45)
nombres<-c("Carlos","Maria","Daniel","Jorge","Luisa")
A<-matrix(c(1:4),ncol = 2,nrow = 2)
lista<-list(x,nombres,A)
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:

lista[[2]]
## [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:

nombres<-c("Carlos","Maria","Daniel","Jorge","Luisa")
edades<-c(12,34,21,24,44)
genero<-c("M","F","M","M","F")

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.

datos<-data.frame(nombres,edades,genero)
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.

estCivil<-factor(c(1,2,3,1,1),levels = c(1,2,3),labels = c("Soltero","Casado","Divorciado") )

Ahora podemos crear nuestro data frame agregando este nuevo factor

datos<-data.frame(nombres,edades,genero,estCivil)
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í:

numeros<-c("3","6","45")
numeros
## [1] "3"  "6"  "45"
class(numeros)
## [1] "character"
numeros<-as.numeric(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"
genero<-as.factor(genero)
str(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
datos<-data.frame(nombres,edades,genero,estCivil)
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

  1. Use R para calcular \[ \frac{1+2\cdot 3^4}{\frac{5}{6}-7} \]

  2. Considere el conjunto de datos 2, 5, 4, 10, 8

    1. Guarde esta data en un vector con nombre x
    2. Encuentre el cuadrado de cada número
    3. Restele 6 a cada número
    4. Restele 9 a cada numero y luego eleve al cuadrado la respuesta (en una sola linea de código)
  3. Almacene los siguientes conjuntos de datos en un vector, utilizando : o seq

    1. 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10
    2. 1, 8, 27, 64, 125, 216
    3. 0, 25, 50, 75, …, 1000 (de 0 a 1000 de 25 en 25)
  4. 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.