1 Aritmética básica

R puede hacer todas las operaciones básicas de aritmética, pero la importancia de esto radica en que estos procedimientos pueden ser combinados con todas las paqueterías de R, haciendo que una simple suma se repita n cantidad de veces a lo largo de una base de datos, o que podamos multiplicar un factor sobre toda la columna de una tabla.

# Suma
3 + 5
## [1] 8
# Resta
5 - 2
## [1] 3
# Multiplicacion
8 * 9
## [1] 72
# Division
6 / 2
## [1] 3
# Modulo
4 %% 3
## [1] 1
# Potenciacion
3 ^ 4
## [1] 81
# Operaciones compuestas
(20 + 2) / 5
## [1] 4.4

2 Estructura de datos

La estructura de datos es fundamental en R y en el procesamiento de datos en general, no todas las variables pueden ser tratadas de la misma forma, algunas técnicas estadísticas, por ejemplo, no son susceptibles a ser usadas en variables categóricas, por lo que solo podrán ser analizadas a través de métodos cuantitativos, y viceversa.

  • Variable categórica: refieren a características, cualidades, que no se pueden medir numéricamente.
    • Nominales: presenta modalidades no numéricas que no admiten un orden, ej. género o religión.
    • Ordinales: presenta modalidades no numéricas que admiten un orden, ej. evaluar a un profesor 4 excelente, 3 bueno, 2 regular, 1 malo, 0 de la v.
  • Variable numérica: se expresan mediante un número.
    • Discreta: tiene valores aislados, ej. número de focos en tu casa, los hijos en una familia
    • Continua: puede tomar valores entre dos números, ej. peso y estatura

Para trabajar con variables es necesario asignarlas a un objeto a través de <-. De esta forma, es posible hacer toda una serie de operaciones.

a <- 8
b <- 2
c <- 4

# Sustituyendo
(a * b) / c
## [1] 4

Es posible asignar todo tipo de variables a objetos en R. Sin embargo, no se debe perder de vista el tipo de variable que están representando, en R se les conoce como:

  • Numeric: números decimales
  • Integer: números enteros
  • Character: cadenas de texto
  • Complex: números complejos
  • Logical: booleanas (TRUE/FALSE)

Además se tienen objetos de tipo Factor que no son propiamente variables, pero permiten analizar datos categóricos en algunas paqueterías para realizar ejercicios más complejos.

Para conocer la naturaleza de un objeto se usa class()

# Numeric
x <- 1.2
class(x)
## [1] "numeric"
# Integer
y <- 1
class(y)
## [1] "numeric"
# Character
z <- "Hola mundo"
class(z)
## [1] "character"
# Complex
w <- 3 + 2i
class(w)
## [1] "complex"
# Logical
a <- 5 
b <- 10
c <- a < b
class(c)
## [1] "logical"
# Factor
sex <- c("Hombre", "Mujer")
as.factor(sex)
## [1] Hombre Mujer 
## Levels: Hombre Mujer

3 Vectores

Una variable puede tener asignado más de un valor por lo que es necesario crear vectores esto es particularmente útil cuando analizamos bases de datos grandes. Para declarar un vector se utiliza la palabra reservada c seguida de un paréntesis donde se colocan los elementos del vector separados por coma. Recuerde que un vector puede aceptar todo tipo de objetos.

v_integer <- c(1,2,3,4,5)
v_string <- c("ingreso", "ahorro", "consumo")
v_boolean <- c(TRUE, FALSE, TRUE)
  • Ejercicio: A continuación se presentan las ganancias y pérdidas de las acciones de dos empresas durante una semana
walmex <- c(-200, 250, -300, 200, 1500)
femsa <- c(-100, 150, -400, 120, 150)

Cada una de las ganancias representa un día de la semana, por lo que sería más comprensible la información si nombramos los elementos del vector con names()

names(walmex) <- c("Lunes", "Martes", "Miercoles", "Jueves", "Viernes")
print(walmex)
##     Lunes    Martes Miercoles    Jueves   Viernes 
##      -200       250      -300       200      1500
names(femsa) <- c("Lunes", "Martes", "Miercoles", "Jueves", "Viernes")
print(femsa)
##     Lunes    Martes Miercoles    Jueves   Viernes 
##      -100       150      -400       120       150
  1. ¿Cuáles fueron las ganancias o pérdidas de estas empresas en la semana? Para saberlo solo se deben sumar los vectores. Recuerde que las operaciones con vectores están sujetas a que cada uno de estos tenga el mismo número de elementos.
ingresos <- walmex + femsa
print(ingresos)
##     Lunes    Martes Miercoles    Jueves   Viernes 
##      -300       400      -700       320      1650

El miercoles se perdieron $700, pero el viernes se ganaron $1650

  1. ¿Cuáles fueron las ganancias o pérdidas de cada una de las empresas en la semana? Suma todo el vector con sum()
total_walmex <- sum(walmex) 
total_walmex
## [1] 1450
total_femsa <- sum(femsa)
total_femsa
## [1] -80

Con las acciones de Walmart se ganaron $1,450 y con femsa se perdieron $80

  1. ¿Cuáles fueron las ganancias totales de ambas empresas en la semana?
total_ingresos <- total_walmex + total_femsa
total_ingresos
## [1] 1370

El total de ingresos fue de $1,370 pesos

  1. Compara si en efecto las ganancias de Walmart son mayores que las de Femsa
total_walmex > total_femsa
## [1] TRUE

Las ganancias de Walmart son mayores que las de Femsa

Para seleccionar un elemento dentro de un vector se usa [] tomando en cuenta que los elementos se numeran de 1 en adelante

  1. ¿Cuáles son las ganancias y pérdidas del viernes?
walmex_viernes <- walmex[5]
walmex_viernes
## Viernes 
##    1500

El viernes se ganaron $1,500 pesos

Para seleccionar un elemento dentro de un vector se usa [x,y] para hacer una selección exacta, o [x:z] para seleccionar un recorrido

  1. ¿Cuáles son las ganancias y pérdidas del martes, miercoles y jueves?
walmex_mmj <- walmex[c(2,3,4)]
walmex_mmj
##    Martes Miercoles    Jueves 
##       250      -300       200
walmex_mmj <- walmex[c(2:4)]
walmex_mmj
##    Martes Miercoles    Jueves 
##       250      -300       200

Las ganancias y pérdidas del martes, miercoles y jueves son $250, -$300 y $200 pesos respectivamente.

Se puede seleccionar a través de los nombres que se asignaron a cada elemento del vector a traves de names()

  1. ¿Cuáles son las ganancias y pérdidas del lunes, miercoles y jueves?
walmex_l <- walmex["Lunes"]
walmex_l
## Lunes 
##  -200

Las pérdidas fueron de $200 pesos

  1. A través de una comparación, ¿qué días Walmart gano más de $100 pesos?
walmex > 100
##     Lunes    Martes Miercoles    Jueves   Viernes 
##     FALSE      TRUE     FALSE      TRUE      TRUE

Con Walmart los días que obtuvimos más de $100 pesos fueron el martes, el jueves y el viernes

  1. Eleva las ganancias de Femsa a la tercera potencia, ¿qué día se ganó más dinero?
femsa^2
##     Lunes    Martes Miercoles    Jueves   Viernes 
##     10000     22500    160000     14400     22500

El miercoles se ganaron $1,600 pesos

Los vectores también pueden ser creados con la función seq() que permite crear secuencias personalizadas a manera de, por ejemplo, sucesiones aritméticas.

  1. Genera una secuencia de 1 a 30 que aumente una unidad a la vez usamos
seq(1, 30, by = 1)
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30
  1. Crea una secuencia que aumente de 1 a 50 que aumente en 5 unidades cada vez
seq(1, 40, by = 5)
## [1]  1  6 11 16 21 26 31 36
  1. ¿Cuál es el promedio de ganancias de Femsa? Usa mean()
mean(femsa)
## [1] -16

En promedio Walmart obtuvo pérdidas de -$16 pesos durante la semana

  1. ¿Cuál es la desviación estándar? Usa sd()
sd(femsa)
## [1] 238.8095

La desviación estándar es de más/menos $238.81 pesos

Al usar length.out se genera un vector de 5 números iniciando desde el 1 al 10

seq(1, 10, length.out = 5) 
## [1]  1.00  3.25  5.50  7.75 10.00

Una forma más sencilla de crear una secuencia de números es con :

-7:7
##  [1] -7 -6 -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7

A través de la función rep() se pueden generar vectores con valores repetidos, por ejemplo, si se quiere un vector donde el 2 se repita diez veces se usa

rep(2,10)
##  [1] 2 2 2 2 2 2 2 2 2 2

Se puede ocupar esta misma función con strings

rep("hola", 3)
## [1] "hola" "hola" "hola"

Si lo que quieres es repetir una secuencia se usa

rep(1:3, 4)
##  [1] 1 2 3 1 2 3 1 2 3 1 2 3

Se pueden repetir los elementos al interior de una secuencia, por ejemplo, aquí se repiten dos veces cada elemento del vector

rep(1:4, each = 2)
## [1] 1 1 2 2 3 3 4 4

4 Matrices

Una matriz es un conjunto bidimensional de números. Dado que puede definirse tanto la suma como el producto de matrices, en mayor generalidad se dice que son elementos de un anillo. Una matriz se representa por medio de una letra mayúscula (A,B, …) y sus elementos con la misma letra en minúscula (a,b, …), con un doble subíndice donde el primero indica la fila y el segundo la columna a la que pertenece.

Existen dos formas para declarar matrices en R, una por columnas y otra por filas.

\[ A = \begin{equation} \begin{pmatrix} a_{11} & a_{12} & ... & a_{1n}\\ a_{21} & a_{22} & ... & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & ... & a_{mn} & \end{pmatrix} \end{equation} \]

Se utiliza la función matrix() para declarar una matriz, esta función tiene varias parámetros: el primero es data, hace referencia al vector que contiene los datos de la matriz; el segundo es nrow, indica el número de filas que contenie la matriz; el tercero, ncol representa el número de columnas que contiene la matriz; y el último, byrow indica si el vector data está ordenado por filas o columnas

# Por columnas
a <- c(1,2,3,4,8,5,9,10,8)
A  <- matrix(data = a,
             nrow = 3,
             ncol = 3,
             byrow = FALSE)
A
##      [,1] [,2] [,3]
## [1,]    1    4    9
## [2,]    2    8   10
## [3,]    3    5    8
# Por filas
b <- c(1,4,9,2,8,10,3,5,8)
B <- matrix(data = b,
            nrow = 3,
            ncol = 3,
            byrow = TRUE) 
B
##      [,1] [,2] [,3]
## [1,]    1    4    9
## [2,]    2    8   10
## [3,]    3    5    8

Con matrices es posible hacer un gran número de operaciones.

# Multiplicacion
A * B
##      [,1] [,2] [,3]
## [1,]    1   16   81
## [2,]    4   64  100
## [3,]    9   25   64
# Suma
A + B
##      [,1] [,2] [,3]
## [1,]    2    8   18
## [2,]    4   16   20
## [3,]    6   10   16
# Resta
A - B
##      [,1] [,2] [,3]
## [1,]    0    0    0
## [2,]    0    0    0
## [3,]    0    0    0
# Transpuesta 
t(A)
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    8    5
## [3,]    9   10    8
# Diagonal
diag(A)
## [1] 1 8 8
# Traza
sum(diag(A))
## [1] 17
# Determinante
det(A)
## [1] -56
# Inversa
solve(A)
##       [,1]       [,2]       [,3]
## [1,] -0.25 -0.2321429  0.5714286
## [2,] -0.25  0.3392857 -0.1428571
## [3,]  0.25 -0.1250000  0.0000000
# Eigenvalores y eigenvectores
eigen(A)
## eigen() decomposition
## $values
## [1] 17.100890 -1.860757  1.759866
## 
## $vectors
##            [,1]       [,2]       [,3]
## [1,] -0.4741780 -0.9056452  0.4920372
## [2,] -0.6962798 -0.1970733 -0.7793662
## [3,] -0.5388410  0.3754582  0.3879275

Recuerda que muchas técnicas en estadística dependen de que las matrices sean cuadradas

# Multiplicacion de matrices
D  <- matrix(data = c(1,2,2,4,2,1),
             nrow = 3,
             ncol = 2,
             byrow = FALSE)

E  <- matrix(data = c(5,4,6,1,8,9),
             nrow = 2,
             ncol = 3,
             byrow = FALSE)
D %*% E
##      [,1] [,2] [,3]
## [1,]   21   10   44
## [2,]   18   14   34
## [3,]   14   13   25

Toma en consideración que las matrices pueden ser resultas a manera de sistemas de ecuación, siempre y cuando estas sean cuadradas.

  1. Suponga el siguiente sistema de ecuaciones

\[ 2x + 3y = 1 \] \[ 3x - 7y = 2 \]

Este sistema se puede representar como una matriz de tal fora que tenemos

\[ \begin{pmatrix} 2 & 3\\ 3 & -7 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} =\begin{pmatrix}1\\ 2 \end{pmatrix} \] Para resolver esta sistema de ecuaciones declaramos las matrices de coeficientes y la de datos independientes, y resolvemos con solve().

# Matriz de coeficientes
A <- matrix(c(2,3,3,-7), nrow = 2) 

 # Matriz de datos independientes
b <- matrix(c(1,2), nrow = 2)

# Solución del sistema
solve(A,b) 
##             [,1]
## [1,]  0.56521739
## [2,] -0.04347826

La solución es \[ \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 0.56521739 \\ -0.04347826 \end{pmatrix} \]

B. Resuelve el siguiente sistema de ecuaciones con matrices

\[ 2x+y-z=6 \] \[ x+y+z=6 \] \[ -x-y+z=-4 \]

El sistema anterior, se puede expresar de la siguiente forma:

\[ \begin{pmatrix} 2 & 1& -1\\ 1 & 1&1 \\ -1 & -1 & 1 \end{pmatrix} \begin{pmatrix} x \\ y\\z \end{pmatrix} =\begin{pmatrix}6\\ 6 \\ -4 \end{pmatrix} \]

Entonces

A <- matrix(c(2,1,-1,1,1,1,-1,-1,1), ncol = 3, byrow = TRUE)

b <- matrix(c(6,6,-4), nrow = 3)

solve(A, b)
##      [,1]
## [1,]    2
## [2,]    3
## [3,]    1

La solución es

\[ \begin{pmatrix} x \\ y \\z \end{pmatrix} = \begin{pmatrix} 2 \\ 3\\1 \end{pmatrix} \]

Otra forma de crear matrices es a través de vectores. Primero, se crean los vectores que contienen la información, después, se crea un vector que combine todos los vectores, finalmente, se crea la matriz.

A continuación se presentan las ganancias de tres empresas para dos trimestres diferentes

apple <- c(460.998, 314.4)
amazon <- c(290.475, 247.900)
pepsico <- c(309.306, 165.8)

ganancias <- c(apple,
               amazon,
               pepsico)

ganancias_mtx <- matrix(ganancias, 
                      byrow = TRUE,
                      nrow = 3)
ganancias_mtx
##         [,1]  [,2]
## [1,] 460.998 314.4
## [2,] 290.475 247.9
## [3,] 309.306 165.8

Es posible poner nombres a las filas y columnas de la matriz creando los vectores que contengan los títulos.

trimestre <- c("T2",
               "T3")
emisora <- c("Apple", 
             "Amazon", 
             "Pepsico")

colnames(ganancias_mtx) <- trimestre
rownames(ganancias_mtx) <- emisora
ganancias_mtx
##              T2    T3
## Apple   460.998 314.4
## Amazon  290.475 247.9
## Pepsico 309.306 165.8
  1. ¿Cuáles son las ganancias de cada una de las emisoras? Guarda el resultado en un objeto. Suma las filas rowSums(). Podemos poner este resultado en una variable.
ganancia_total <- rowSums(ganancias_mtx)
ganancia_total
##   Apple  Amazon Pepsico 
## 775.398 538.375 475.106
  1. Agrega los resultados a la matriz original. Usa cbind()
ganancias_tot <-cbind(ganancias_mtx,
                      ganancia_total) 
ganancias_tot
##              T2    T3 ganancia_total
## Apple   460.998 314.4        775.398
## Amazon  290.475 247.9        538.375
## Pepsico 309.306 165.8        475.106

A continuación se construye otra matriz con las ganancias de dos trimestres para tres nuevas emisoras

adobe <- c(474.5, 552.5)
nvidia <- c(310.7, 338.7)
microsoft <- c(380.3,468.5)

ganancias_mtx2 <- matrix(c(adobe, 
                           nvidia, 
                           microsoft), 
                            nrow = 3, 
                            byrow = TRUE)

trimestre2 <- c("T2", 
                "T3")
emisora2 <- c("Adobe", 
              "Nvidia", 
              "Microsoft")

colnames(ganancias_mtx2) <- trimestre2
rownames(ganancias_mtx2) <- emisora2

ganancias_mtx2
##              T2    T3
## Adobe     474.5 552.5
## Nvidia    310.7 338.7
## Microsoft 380.3 468.5
  1. Une la primera matriz con la creada en el paso anterior. Usa rbind()
tot_emisoras <- rbind(ganancias_mtx,
                      ganancias_mtx2)
tot_emisoras
##                T2    T3
## Apple     460.998 314.4
## Amazon    290.475 247.9
## Pepsico   309.306 165.8
## Adobe     474.500 552.5
## Nvidia    310.700 338.7
## Microsoft 380.300 468.5
  1. ¿Cuál es el valor total de las ganancias para el T2 y T3 de todas las emisoras? Usa colsums()
tot_ganancias_v <- colSums(tot_emisoras)
tot_ganancias_v
##       T2       T3 
## 2226.279 2087.800

Para seleccionar elementos al interior de una matriz usamos [] tomando en cuenta que ahora debemos seleccionar filas y columnas.

  1. ¿Cuáles son las ganancias de Apple en el tercer trimestre? [1, 2] selecciona el elemento de la primera fila y la segunda columna.
tot_emisoras[1,2]
## [1] 314.4

Si [1:3, 2:4] da como resultado una matriz con los datos en las filas 1, 2 y 3; y las columnas 2, 3, 4, entonces

  1. ¿Cuáles son las ganancias de Adobe y Nvidia en el primer y segundo trimestre?
tot_emisoras[4:5, 1:2]
##           T2    T3
## Adobe  474.5 552.5
## Nvidia 310.7 338.7

Para seleccionar todos los elementos de la primera columna usamos [,1] y para el caso de seleccionar la primera fila [1,]

  1. Muestra las ganancias de todas las emisoras en el T3
trim3 <- tot_emisoras[, 2]
trim3
##     Apple    Amazon   Pepsico     Adobe    Nvidia Microsoft 
##     314.4     247.9     165.8     552.5     338.7     468.5
  1. ¿Cuáles son las ganancias de Apple y Amazon en el T3?
app_ama <- tot_emisoras[1:2, 2]
app_ama
##  Apple Amazon 
##  314.4  247.9
  1. ¿Cuál es la ganancia promedio de todas las emisoras en el trimestre 3?
mean(trim3)
## [1] 347.9667
  1. ¿Cuál es la ganancia promedio de Apple y Amazon en el T3?
mean(app_ama)
## [1] 281.15
  1. Las ganancias deben ser repartidas entre 5 accionistas
activos <- tot_emisoras / 5
activos
##                T2     T3
## Apple     92.1996  62.88
## Amazon    58.0950  49.58
## Pepsico   61.8612  33.16
## Adobe     94.9000 110.50
## Nvidia    62.1400  67.74
## Microsoft 76.0600  93.70
  1. Multiplica cada una de las ganancias de todas las emisoras por dos
activos2 <- tot_emisoras * 2
activos2
##                T2     T3
## Apple     921.996  628.8
## Amazon    580.950  495.8
## Pepsico   618.612  331.6
## Adobe     949.000 1105.0
## Nvidia    621.400  677.4
## Microsoft 760.600  937.0

A continuación se presenta una matriz con las acciones que compramos de cada una de las emisoras

acc_apple <- c(5, 5)
acc_amazon <- c(6, 6)
acc_pepsico <- c(7, 7)
acc_adobe <- c(4, 4)
acc_nvidia <- c(4, 4)
acc_microsoft <- c(4.9, 4.9)

acciones_emisoras <- matrix(c(acc_apple,
                              acc_amazon,
                              acc_pepsico,
                              acc_adobe, 
                              acc_nvidia, 
                              acc_microsoft), 
                            nrow = 6, 
                            byrow = TRUE)

trimestre3 <- c("T2", 
                "T3")
emisora3 <- c("Apple",
              "Amazon",
              "Pepsico",
              "Adobe", 
              "Nvidia", 
              "Microsoft")

colnames(acciones_emisoras) <- trimestre3
rownames(acciones_emisoras) <- emisora3

acciones_emisoras
##            T2  T3
## Apple     5.0 5.0
## Amazon    6.0 6.0
## Pepsico   7.0 7.0
## Adobe     4.0 4.0
## Nvidia    4.0 4.0
## Microsoft 4.9 4.9
  1. ¿Cuál es la ganancia que se obtiene por las emisoras de acuerdo al número de acciones compradas?
ganacias_acciones <- tot_emisoras * acciones_emisoras
ganacias_acciones
##                 T2      T3
## Apple     2304.990 1572.00
## Amazon    1742.850 1487.40
## Pepsico   2165.142 1160.60
## Adobe     1898.000 2210.00
## Nvidia    1242.800 1354.80
## Microsoft 1863.470 2295.65
  1. ¿Cuál es la ganancia promedio que se obtiene de todas las emisoras una vez?
mean(ganacias_acciones)
## [1] 1774.809

5 Listas

Las listas en R son estructuras de datos que permiten almacenar diferentes tipos de objetos como matrices, vectores, bases de datos u otras listas, bajo un mismo nombre. Para declarar una lista en R, se utiliza la función list(), y entre paréntesis se escriben las variable separadas por coma. A continuación se crea una lista con varias estructuras de datos, un vector, una matriz, un booleano y una base de datos

my_boolean <- TRUE

my_vector <- 2:11 

my_matrix <- matrix(2:10, ncol = 3)

data <- mtcars
my_df <- data[1:5,]

my_list <- list(bool = my_boolean,
                vec = my_vector,
                mat = my_matrix,
                df = my_df)
my_list
## $bool
## [1] TRUE
## 
## $vec
##  [1]  2  3  4  5  6  7  8  9 10 11
## 
## $mat
##      [,1] [,2] [,3]
## [1,]    2    5    8
## [2,]    3    6    9
## [3,]    4    7   10
## 
## $df
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

Para obtener los valores de la lista, se escribe el nombre de la lista seguido el símbolo de peso $ y luego el nombre de la variable.

my_list$bool
## [1] TRUE
my_list$df
  1. Haciendo uso de estos objetos construye una lista
mov <- "Star Wars"
char <- c("Luke Skywalker", "Leia Organa", "Han Solo", "Darth Vader", "Yoda")
IMDb1 <- c(4.5, "IMDb1", "La mejor pelicula que he visto")
IMDb2 <- c(3.0, "IMDb2", "Me gustan más los Avengers")
IMDb3 <- c(5.0, "IMDb3", "Es lo máximo")
  1. Crea una matriz
movies_matrix <- matrix(c(IMDb1, IMDb2, IMDb3), 
                        nrow = 3, 
                        byrow = TRUE)
movies_matrix
##      [,1]  [,2]    [,3]                            
## [1,] "4.5" "IMDb1" "La mejor pelicula que he visto"
## [2,] "3"   "IMDb2" "Me gustan más los Avengers"    
## [3,] "5"   "IMDb3" "Es lo máximo"
  1. Nombra los elementos de la matriz con colnames() y rownames()
info <- c("Calif", "Fuente", "Coment")
number <- c("1", "2", "3")

colnames(movies_matrix) <- info
rownames(movies_matrix) <- number

rev <- movies_matrix
rev
##   Calif Fuente  Coment                          
## 1 "4.5" "IMDb1" "La mejor pelicula que he visto"
## 2 "3"   "IMDb2" "Me gustan más los Avengers"    
## 3 "5"   "IMDb3" "Es lo máximo"
  1. Crea una lista con la información del inciso a.
star_wars <- list(moviename = mov, 
                  characters = char, 
                  reviews = c(IMDb1, IMDb2, IMDb3))
star_wars
## $moviename
## [1] "Star Wars"
## 
## $characters
## [1] "Luke Skywalker" "Leia Organa"    "Han Solo"       "Darth Vader"   
## [5] "Yoda"          
## 
## $reviews
## [1] "4.5"                            "IMDb1"                         
## [3] "La mejor pelicula que he visto" "3"                             
## [5] "IMDb2"                          "Me gustan más los Avengers"    
## [7] "5"                              "IMDb3"                         
## [9] "Es lo máximo"
  1. Selecciona a los personajes de la película
star_wars$characters
## [1] "Luke Skywalker" "Leia Organa"    "Han Solo"       "Darth Vader"   
## [5] "Yoda"
  1. Selecciona a Leia
star_wars[["characters"]][2]
## [1] "Leia Organa"
  1. Se ha olvidado colocar la fecha de lanzamiento de la película, agrega un nuevo elemento a la lista que contenga 1977
star_wars_list_full <- c(star_wars, year=1980)
star_wars_list_full
## $moviename
## [1] "Star Wars"
## 
## $characters
## [1] "Luke Skywalker" "Leia Organa"    "Han Solo"       "Darth Vader"   
## [5] "Yoda"          
## 
## $reviews
## [1] "4.5"                            "IMDb1"                         
## [3] "La mejor pelicula que he visto" "3"                             
## [5] "IMDb2"                          "Me gustan más los Avengers"    
## [7] "5"                              "IMDb3"                         
## [9] "Es lo máximo"                  
## 
## $year
## [1] 1980

6 Data Frame

Un data frame es lo que popularmente conocemos como base de datos, existen varias formas de crearlas, ya sea importando una variedad de archivos a R como aquellos con extensión .xls, .csv., .prn, etc., o a través de la consola utilizando los códigos correspondientes para cada caso

  • .prn. Base de datos en texto separado por espacios.

{r setup, include = FALSE} knitr::opts_chunk$set(echo = TRUE)

Datos_Espacios <- read.csv("D:/Libros/Seminarios/Fastat/R Basico/Datos_Espacios.prn", sep = "")
#View(Datos_Espacios)
  • .txt. Base de datos en un bloc de notas.
Datos_txt <- read.delim("D:/Libros/Seminarios/Fastat/R Basico/Datos_Espacios.txt")
#View(Datos_txt)
  • .csv. Base de datos en texto separado por comas. Si el archivo que se desea importar no tiene nombre en las columnas, se utiliza col_names = FALSE.
# install.packages("readr")
library(readr)

Datos_csv <- read_csv("D:/Libros/Seminarios/Fastat/R Basico/Datos_Espacios.csv")
#View(Datos_csv)
  • .xls o .xlsx, Base de datos de Excel.
# install.packages("readxl")
library(readxl)

Datos_xlsx <- read_excel("D:/Libros/Seminarios/Fastat/R Basico/Datos_Espacios.xlsx")
#View(Datos_xlsx)

Si lo que se desesa es importar un archivo desde RStudio se debe tener en cuenta las cuatro pantallas del IDE.

  1. Script: Generalmente es donde se escribe el código para posteriormente ejecutarlo.
  2. Consola: Permite escribir código, pero frecuentemente se usa para ver el resultado de lo ejecutado en el script
  3. Ambiente Global: Es donde se pueden revisar las variables, objetos y bases de datos, conserva el historial e importa bases de datos.
  4. Multifunción: Permite la navegación entre las carpetas, cargar y recibir ayuda de los paquetes que estemos utilizando, así como mostrar los resultados de gráficas, mapas, etc.

Para importar una base de datos sólo se debe acceder a Environment > Import Dataset y se selecciona el caso correspondiente, por ejemplo, From text (base) si la base de datos es un texto, From text (readr) para el caso de .csv, y From text Excel para el caso de .xls. Después, se busca el archivo que contiene nuestra base de datos, se revisa la pantalla preliminar antes de abrirlo y se acepta.

Ahora bien, siempre que iniciamos el trabajo es recomendable explorar la estructura de la base de datos con str()

str(Datos_xlsx)
## tibble [100 x 4] (S3: tbl_df/tbl/data.frame)
##  $ genero     : chr [1:100] "macho" "hembra" "hembra" "macho" ...
##  $ Agua_dulce : num [1:100] 108 131 105 86 99 87 94 117 79 99 ...
##  $ Mar_abierto: num [1:100] 368 355 469 506 402 423 440 489 432 403 ...
##  $ origen     : chr [1:100] "alaska" "alaska" "alaska" "alaska" ...

En este caso, todas las variables de la base de datos están definidas correctamente, pero en caso de no estarlo es fundamental hacerlo.

Datos_xlsx2 <- read_excel("D:/Libros/Seminarios/Fastat/R Basico/Datos_Espacios.xlsx",
                          sheet = "Hoja1",
                          col_types = c("numeric","text","skip","text"))
                          
str(Datos_xlsx2)
## tibble [100 x 3] (S3: tbl_df/tbl/data.frame)
##  $ genero    : num [1:100] NA NA NA NA NA NA NA NA NA NA ...
##  $ Agua_dulce: chr [1:100] "108" "131" "105" "86" ...
##  $ origen    : chr [1:100] "alaska" "alaska" "alaska" "alaska" ...

El paso anterior muestra lo delicado que puede llegar a ser este procedimiento. Aquí se ha cometido el error de nombrar a la variable genero como numérica cuando es character, de ahí que R no pueda identificarla, y la variable Agua_dulce ahora aparece como texto, cuando en realidad es numérica. Además, se utilizó skip para omitir la variable Mar_abierto. Nunca de por sentado que R puede clasificar las variables de forma correcta automáticamente.

Si las columnas de una tabla que deseas importar no tienen nombre utiliza col_names = FALSE.

# Datos <- read_excel("C:/Documents/Carpeta/name_excel.xlsx", 
#                    sheet = "Hoja1",
#                    col_names = FALSE) # Se utiliza cuando las columnas no tienen nombre

Para trabajar adecuadamente usaremos la base de datos denominada como Datos_xlsx. Para seleccionar datos en la base usamos [],

  1. Selecciona los datos ubicados en la fila 1, columna 3
Datos_xlsx[1,3]
  1. Seleccionar toda la cuarta fila
Datos_xlsx[4,]
  1. Selecciona de la primera a la segunda columna
Datos_xlsx[,1:3]

Para agregar una nueva columna a un data frame ya defindo se escribe el nombre del data frame seguido el símbolo $ y a continuación el nombre de la nueva variable. Recuerda que la base de datos debe ser cuadrada, así que la nueva variable debe tener el mismo número de observaciones que las otras variables.

  1. Agrega la columna Agua_salada con una secuencia que vaya del 1 al 100
Datos_xlsx$Agua_salada <- c(1:100)
Datos_xlsx

Para borrar una columna, se escribe el nombre del data frame seguido el símbolo $ y a continuación el nombre de la columna y se le asigna el valor NULL, por ejemplo:

  1. Borra la columna creada en el paso anterior
Datos_xlsx$Agua_salada  <- NULL
Datos_xlsx

Es posible crear una base de datos a partir de vectores con la función data.frame.

edo <- c("cdmx", "edomex", "oax", "chi", "aguasc", "jal", "nuevol", "michoa")
contamina <- c("alta", "alta", "baja", "baja", "regular", "regular", "regular", "regular")
pobla <- c(11, 20, 15, 17, 18, 9, 4, 3)
tamano <- c(58.64, 243.2, 154, 103, 413, 447.3, 756.6, 676.11)
narco <- c(FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE)

mex_df <- data.frame(edo,
                     contamina,
                     pobla,
                     tamano,
                     narco)
  1. Revisa la estructura
str(mex_df)
## 'data.frame':    8 obs. of  5 variables:
##  $ edo      : chr  "cdmx" "edomex" "oax" "chi" ...
##  $ contamina: chr  "alta" "alta" "baja" "baja" ...
##  $ pobla    : num  11 20 15 17 18 9 4 3
##  $ tamano   : num  58.6 243.2 154 103 413 ...
##  $ narco    : logi  FALSE FALSE FALSE FALSE TRUE TRUE ...
  1. ¿Cuál es el tamaño del Estado de México?
mex_df[2, 4]
## [1] 243.2
  1. Muestra toda la columna de contaminacion
mex_df[ ,2]
## [1] "alta"    "alta"    "baja"    "baja"    "regular" "regular" "regular"
## [8] "regular"

Si las columnas estan nombradas, como en este caso, es posible llamarlas con su nombre

  1. Muestra los primeros 5 datos de la columna pobla
mex_df[1:5, "pobla"]
## [1] 11 20 15 17 18
  1. Muestra los niveles de contaminación de Jalisco, Nuevo León y Michoacan
mex_df[c(6:8), "contamina"]
## [1] "regular" "regular" "regular"
  1. Muestra la información de
mex_df[c(3,4), ]
  1. Muestra toda la información de la ciudad de México
mex_df[1, ]
  1. Muestra toda la columna edo
mex_df$edo
## [1] "cdmx"   "edomex" "oax"    "chi"    "aguasc" "jal"    "nuevol" "michoa"
  1. Muestra la información de la primera a la tercer columna
mex_df[ , 1:3]
  1. Selecciona las primeras dos columnas con todas sus filas
mex_df[ , c(1,2)]
  1. Seleccionar las filas de la uno a la tres con todas las columnas
mex_df[c(1:3),]
  1. Muestra a los estados que tienen presencia del narcotráfico
mex_df[narco, "edo"]
## [1] "aguasc" "jal"    "nuevol" "michoa"
mex_df[narco, TRUE]

Para hacer una subselección, es decir, un subconjunto de toda nuestra base de datos se usa subset(). Es posible usar operadores comparativos para hacer busquedas al interior de la base de datos

  1. Identifica los estados con una población menor a 10 millones
subset(mex_df, pobla < 10)
  1. Identifica los estados con contaminación baja
subset(mex_df, contamina == "baja")
  1. Identifica los estados con presencia de contaminación diferente a la baja
subset(mex_df, contamina != "baja")
  1. Muestra los estados con un tamaño mayor a los 400\(km^2\)
mex_df[mex_df$tamano > 400, ]
subset(mex_df, tamano > 400)
  1. Muestra todo la información de Oaxaca
mex_df[mex_df$edo == "oax", ]
  1. ¿Qué estados no tienen narcotráfico?
mex_df[mex_df$narco != TRUE, ]

Para filtrar más de una variable podemos usar & que hace referencia a y, así como | el cual indica o

  1. ¿Cuáles son los estados con un tamaño menor a los 100\(km^2\) y cuya contaminación sea alta?
mex_df[mex_df$contamina == "alta" &
          mex_df$tamano < 100, ]
  1. ¿Cuáles son los estados con presencia de narco y población mayor o igual a 11 millones?
mex_df[mex_df$narco == TRUE &
          mex_df$pobla >= 11, ]
  1. ¿Cuáles son los estados con población menor o igual a 15 millones o tamaño mayor o igual a 400\(km^2\)
mex_df[mex_df$pobla <= 15 |
          mex_df$tamano >= 400, ]
  1. ¿Cuáles son los estados sin presencia del narco o contaminación baja?
mex_df[mex_df$narco == "FALSE" |
          mex_df$contamina == "baja", ]

Para conocer la estadística descriptiva más básica de nuestra base de datos se usa summary(). Esto también se puede pedir por variable

  1. Oben la estadística descriptiva de toda la base de datos
summary(mex_df)
##      edo             contamina             pobla           tamano      
##  Length:8           Length:8           Min.   : 3.00   Min.   : 58.64  
##  Class :character   Class :character   1st Qu.: 7.75   1st Qu.:141.25  
##  Mode  :character   Mode  :character   Median :13.00   Median :328.10  
##                                        Mean   :12.12   Mean   :356.48  
##                                        3rd Qu.:17.25   3rd Qu.:504.50  
##                                        Max.   :20.00   Max.   :756.60  
##    narco        
##  Mode :logical  
##  FALSE:4        
##  TRUE :4        
##                 
##                 
## 

Observe que las variables cualitativas no cuentan con información, toda vez que no pueden ser sometidas al mismo análisis.

  1. Obten las estadísticas de la variable población.
summary(mex_df$pobla)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    3.00    7.75   13.00   12.12   17.25   20.00

Para agregar una nueva columna a un data frame ya defindo se escribe el nombre del data frame seguido el símbolo $ y a continuación el nombre de la nueva variable. Recuerda que la base de datos debe ser cuadrada, así que la nueva variable debe tener el mismo número de observaciones que las demás.

  1. Agrega la columna pobreza a la base de datos
mex_df$pobreza <- c("alta", "moderada", "baja", "alta", "moderada", "baja", "alta", "alta")
str(mex_df)
## 'data.frame':    8 obs. of  6 variables:
##  $ edo      : chr  "cdmx" "edomex" "oax" "chi" ...
##  $ contamina: chr  "alta" "alta" "baja" "baja" ...
##  $ pobla    : num  11 20 15 17 18 9 4 3
##  $ tamano   : num  58.6 243.2 154 103 413 ...
##  $ narco    : logi  FALSE FALSE FALSE FALSE TRUE TRUE ...
##  $ pobreza  : chr  "alta" "moderada" "baja" "alta" ...

Para borrar una columna, se escribe el nombre del data frame seguido el símbolo $ y a continuación el nombre de la columna y se le asigna el valor NULL.

  1. Borra la columna del dato anterior
mex_df$pobreza <- NULL
mex_df

Para agregar una nueva fila a un data frame ya defindo se utliza la función rbind() tal como se utilizó en matrices.

  1. Agrega la fila con los datos de Veracruz.
verac <- c("Verac", "regular", 10.85, 20.21, FALSE)
mex_df <- rbind(mex_df, verac)
mex_df

Para borrar una fila se escribe el nombre del data frame seguido el símbolo [], y entre los corchetes se escribe el número de la fila que se desea eliminar con el signo menos.

  1. Borra la fila creada en el paso anterior.
mex_df <- mex_df[-9,]
mex_df

Para ordenar los datos se usa order(), de esta forma es posible conocer el nivel de cada uno de los elementos de un vector. Si lo que se busca es ordenar de menor a mayor (de A a Z)

order(mex_df$edo)
## [1] 5 1 4 2 6 8 7 3
edo[order(mex_df$edo)]
## [1] "aguasc" "cdmx"   "chi"    "edomex" "jal"    "michoa" "nuevol" "oax"
  1. Ordena de menor a mayor la variable población
pobla[order(mex_df$pobla)]
## [1] 11 15 17 18 20  3  4  9

No obstante, al agregar o quitar filas o columnas, la base de datos puede pasar todas las variables como tipo character, en ese caso, será necesario transformar cada una de las variables como corresponda usando as.numeric y as.character

  1. Transforma la variable x <- 2324 a character
x <- 2324
str(x)
##  num 2324
x <- as.character(x)
str(x)
##  chr "2324"
  1. Transforma la variable y <- TRUE a numeric
y <- TRUE
str(y)
##  logi TRUE
y <- as.numeric(y)
str(y)
##  num 1

7 Gráficas

Para realizar una gráfica se deben tener claras las variables a gráficar, ya sean numéricas o categóricas, en este caso se trabaja con las primeras.

7.1 Lineales

x <- c(1,2,3,4,5)
y <- c(1,4,9,16,25)

plot(x, y, type = "o")

plot(x, y, type = "b")

plot(x, y, type = "s")

plot(x, y, type = "S")

plot(x, y, type = "l")

plot(x, y, type = "l", lty = 5)

plot(x, y, type = "l", lty = 1, lwd = 2)

plot(x, y, type = "l", lty = 1, lwd = 3, col = 10) 

# Se pueden escoger diferentes tipos de puntos utilizando las siguientes sintaxis:
plot(x, y, pch = 0)

plot(x, y, pch = 16)

Es posible agregar algunos elementos a las gráficas para hacerlas más claras y darles una mejor presentación.

plot(x,
     y,
     type = "l",
     main = "Título del gráfico",
     sub = "Subtítulo del gráfico",
     xlab = "Etiqueta del eje X",
     ylab = "Etiqueta del eje Y")

curve((x), # Ley de asignación, (x) en R representa la función identidad
      from = -5, # Inicio
      to = 5, # Final 
      main= "Función identidad")

7.2 Barras

La función barplot(), se utiliza para realizar gráficos de barra. Esta gráfica nos muestra la frecuencia con la que se han observado los datos de una variable discreta. Suponga se tiene la siguiente información

Femenino = 11 Masculino = 15

barplot(c(11,15), 
        names.arg = c("FEMENINO","MASCULINO"))

Para agregar más elementos se sigue la misma lógica que en las gráficas lineales

barplot(c(11,15), 
        names.arg = c("FEMENINO","MASCULINO"),
        main = "Título del gráfico", 
        sub = "Subtítulo del gráfico",
        xlab = "Etiqueta del eje X",
        ylab = "Etiqueta del eje Y" )

7.3 Histograma

La función hist(), se utiliza para realizar histograma. Esta gráfica nos muestra la distribución de los datos usando barras. Suponga que se tiene la información de la edad de 32 niños y se desea conocer su distrución, para ello se utiliza el siguiente código:

variable_edad <- c(4,5,4,6,7,3,7,6,5,4,6,7,4,5,6,6,6,5,7,6,5,4,5,6,7,8,6,5,4,6,8,3)

hist(variable_edad,
     main = "Título del gráfico", 
     sub = "Subtítulo del gráfico",
     xlab = "Etiqueta del eje X",
     ylab = "Etiqueta del eje Y")

7.4 Pastel

La función pie(), se utiliza para realizar diagramas de pastel. El primer argumento de esta función, son lo valores que demarcarán las divisiones del círculo que representa el 100% del área. Luego se indican los valores que determinarán la construcción de etiquetas. En el siguiente ejemplo se muestra un diagrama de pastel:

porcentajes <- c(0.2,0.1,0.3,0.1,0.3) # Porcentajes asociados a cada persona
etiqueta_porcentajes <- c("Luis","Pedro","Juan","María","José")

pie(porcentajes, 
    labels = etiqueta_porcentajes,
    main = "Título del gráfico", 
    sub = "Subtítulo del gráfico")

Una de las partes más poderosas de R es su gran paquetería, estas funcionan a manera de librerías que contienen un gran número de funciones cuyo objetivo es agilizar el análisis estadístico, facilitar el manejo de las bases de datos, graficas, mapas, etc.

Para hacer uso de las librerías de R primero debemos instalarlas con install.packages() y cargarlas con library(). Ahora se instalara una de las librerías más utilizadas de R, ggplot2 que permite hacer una gran cantidad de gráficas, pero dejaremos este tema para otra ocasión,

# install.packages("ggplot2")
library("ggplot2")