tasas_nom <- c(7.5,6.5,5.5)
precios <- c(250000,350000,450000)
plazos <- c(36,48,60,72)

tasas_mensuales <- round(tasas_nom/100/12,6)

tasas_matriz <- matrix(rep(tasas_mensuales,4),nrow = 4, byrow = T)

precios_matriz <- matrix(rep(precios,4), nrow = 4, byrow = T)

plazos_matriz <- matrix(rep(plazos,3), nrow = 4, byrow = F)

pagos_mensuales <- precios_matriz * tasas_matriz / (1-(1+tasas_matriz)^(-plazos_matriz))

rownames(pagos_mensuales) <- c("36 m","48 m","60 m","72 m")
colnames(pagos_mensuales) <- c("Modelo A","Modelo B","Modelo C")

pagos_mensuales
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965

Índices con matrices

Los índices en matrices son utilizados para acceder, modificar, o extraer elementos específicos dentro de la matriz. Los índices en R funcionan de la siguiente manera:

Para acceder a un elemento específico de una matriz, se usa la notación [fila, columna].

# Seleccionamos el dato de la primera fila y segunda columna
pagos_mensuales; pagos_mensuales[1,2]
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
## [1] 10727.21
# pago mensual en financiamiento a 36 m de Modelo B

Para acceder a toda una fila, se deja en blanco la parte del índice de la columna:

# Seleccionamos todos los pagos mensuales del
# financiamiento a 60 meses
pagos_mensuales; pagos_mensuales[3,]
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
## Modelo A Modelo B Modelo C 
## 5009.487 6848.217 8595.440

Para acceder a toda una columna, se deja en blanco la parte del índice de la fila:

# Selccionamos todos los pagos para 
# financiar el Modelo B
pagos_mensuales[,2]
##      36 m      48 m      60 m      72 m 
## 10727.215  8300.298  6848.217  5883.542

Imaginemos que después de calcular los pagos mensuales, la gerencia quiere responder algunas preguntas específicas:

  1. ¿Cuál es el pago mensual del Modelo B para un plazo de 48 meses?
pagos_mensuales
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
pagos_mensuales[2,2]
## [1] 8300.298
pagos_mensuales["48 m","Modelo B"]
## [1] 8300.298
  1. ¿Cuáles son los pagos mensuales para todos los modelos cuando el plazo es de 60 y 72 meses?
pagos_mensuales[c(3,4),]
##      Modelo A Modelo B Modelo C
## 60 m 5009.487 6848.217 8595.440
## 72 m 4322.528 5883.542 7351.965
pagos_mensuales[c("60 m","72 m"),]
##      Modelo A Modelo B Modelo C
## 60 m 5009.487 6848.217 8595.440
## 72 m 4322.528 5883.542 7351.965
  1. ¿Para qué modelo y en qué plazo se registra el pago mensual más bajo?
pagos_mensuales
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
minimo <- min(pagos_mensuales)

posicion <- which(pagos_mensuales == minimo, arr.ind = TRUE)
posicion[1] # renglón
## [1] 4
posicion[2] # columna
## [1] 1
plazo <- rownames(pagos_mensuales)[posicion[1]]
modelo <- colnames(pagos_mensuales)[posicion[2]]

pagos_mensuales
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
modelo
## [1] "Modelo A"
plazo
## [1] "72 m"
cat("El menor pago mensual es de $",
    round(minimo,2),
    "correspondiente al",
    modelo,
    "en un plazo de",
    plazo,
    ".")
## El menor pago mensual es de $ 4322.53 correspondiente al Modelo A en un plazo de 72 m .



Bibliotecas en R

Las bibliotecas en R, también conocidas como libraries, contienen conjuntos de funciones enfocadas en una misión específica. Éstas, amplían la funcionalidad de R al proporcionar funciones adicionales, datos y documentación, y pueden descargarse gratuitamente desde internet. Son desarrollados por una comunidad mundial de usuarios de R.

Algunas bibliotecas vienen instaladas en R y otras hay que instalarlas manualmente.

  • Podemos instalar bibliotecas desde la sección miscelánea en la pestaña de Packages en donde dice Install. Por ejemplo, probemos con dplyr.

  • Otra vía, es a través de la instrucción de consola install.packages("ggplot2").

Luego de instalar las bibliotecas hay que cargarlas.

  • Desde la ventana miscelánea, podemos encontrar la biblioteca y darle check.

  • Desde la consola, usamos la instrucción library(dplyr).

Una vez cargada ya podemos acceder a sus funciones.

Para conocer qué funciones tiene una biblioteca podemos escribir en la consola:

  • dplyr::
  • help(dplyr)
  • ?dplyr

Para saber qué bibliotecas hemos cargado podemos consultar la sección miscelánea o en la consola usar la función search( ).

# install.packages("dplyr")
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
help(dplyr)
## starting httpd help server ...
##  done
?dplyr

search()
##  [1] ".GlobalEnv"        "package:dplyr"     "package:stats"    
##  [4] "package:graphics"  "package:grDevices" "package:utils"    
##  [7] "package:datasets"  "package:methods"   "Autoloads"        
## [10] "package:base"


Objetos de datos

En R, toda la información se almacena en objetos. Dependiendo de cómo estén organizados los datos, estos objetos pueden adoptar distintas estructuras. Existen cuatro estructuras principales en R:

I. Vectores

II. Matrices

III. Data frames

IV. Listas

Continuamos con los dataframes.


Dataframes

Los dataframes son estructuras de datos bidimensionales en R, similares a una tabla de base de datos o una hoja de cálculo. La gran ventaja de los dataframes es que permiten almacenar columnas con diferentes tipos de datos (números, caracteres, factores, etc.), siempre y cuando cada columna contenga un único tipo de dato.

Algunas características clave de los data frames son:

  1. Dimensiones: Los dataframes tienen filas y columnas, donde las columnas representan variables y las filas representan observaciones.

  2. Tipos de datos: Cada columna debe contener un solo tipo de dato (numérico, texto, lógico, etc.), pero diferentes columnas pueden tener distintos tipos de datos.

  3. Manipulación: Los dataframes permiten acceder, modificar, y operar sobre sus elementos de manera eficiente usando diversas funciones de R.

Mi primer Dataframe

En esta etapa empezamos a trabajar con datos sintéticos, es decir, datos generados artificialmente que reproducen la estructura de datos reales sin contener información sensible.

Este tipo de datos es especialmente útil en el aprendizaje de R porque permite practicar la construcción y manipulación de objetos sin depender de bases de datos externas. Además, facilita la reproducibilidad de los resultados mediante set.seed(), que fija la semilla del generador aleatorio, y el uso de sample(), que permite seleccionar observaciones o construir subconjuntos de forma aleatoria a partir de un conjunto de datos.

En R, este enfoque es particularmente útil cuando se exploran estructuras como los dataframes, ya que permite simular variables y observaciones de manera controlada antes de trabajar con datos reales.

Para crear un dataframe se utiliza la función data.frame().

A continuación se muestra un ejemplo de cómo crear un dataframe con datos aleatorios de estudiantes, incluyendo nombre, sexo, edad, estado de procedencia e ingresos.

# Cargamos la biblioteca de nombres
library(babynames)

# View(babynames)

is.vector(babynames)
## [1] FALSE
is.matrix(babynames)
## [1] FALSE
is.data.frame(babynames)
## [1] TRUE
# Fijamos una semilla para controlar nuestra generación de núms aleatorios
set.seed(123)

# Generamos 20 índices de observaciones
sample(1:100, 20)
##  [1] 31 79 51 14 67 42 50 43 97 25 90 69 57  9 72 26  7 95 87 36
dim(babynames)[1]
## [1] 1924665
indices <- sample(1:length(babynames$name),20,replace=FALSE)
indices
##  [1]  883281  669543 1325900  944672  613997  402313  554826 1498011 1798453
## [10]  401205 1717472  377049   90077  268360  738879  815826   53241 1732761
## [19]  368917  917545
length(indices)
## [1] 20


Nota: Una semilla aleatoria es un número que fija el estado del generador de números aleatorios para que los resultados de ciertos procesos puedan reproducirse exactamente en ejecuciones posteriores.


nombre <- babynames$name[indices]
length(babynames$name)
## [1] 1924665
length(nombre)
## [1] 20
sexo <- babynames$sex[indices]
length(sexo)
## [1] 20
edad <- sample(18:25,20,replace=TRUE)

estado <- c("Ciudad de México", "Querétaro", "Puebla", "Veracruz", "Nuevo León")

estado_procedencia <- sample(estado, 20, replace = TRUE)

estado_procedencia
##  [1] "Veracruz"         "Nuevo León"       "Nuevo León"       "Puebla"          
##  [5] "Ciudad de México" "Veracruz"         "Ciudad de México" "Ciudad de México"
##  [9] "Puebla"           "Veracruz"         "Ciudad de México" "Puebla"          
## [13] "Nuevo León"       "Puebla"           "Querétaro"        "Nuevo León"      
## [17] "Nuevo León"       "Puebla"           "Querétaro"        "Querétaro"
ingreso <- rnorm(20, mean= 8000, sd= 1000)
ingreso
##  [1]  8053.004  8922.267 10050.085  7508.969  5690.831  9005.739  7290.799
##  [8]  7311.991  9025.571  7715.227  6779.282  8181.303  7861.109  8005.764
## [15]  8385.280  7629.340  8644.377  7779.513  8331.782  9096.839
df_estudiantes <- data.frame(Nombre = nombre,
                             Sexo = sexo,
                             Edad = edad,
                             Estado = estado_procedencia,
                             Ingreso = ingreso)

df_estudiantes
##       Nombre Sexo Edad           Estado   Ingreso
## 1     Angela    F   24         Veracruz  8053.004
## 2      Essie    M   19       Nuevo León  8922.267
## 3      Allyn    M   21       Nuevo León 10050.085
## 4     Tanita    F   24           Puebla  7508.969
## 5  Sherriann    F   25 Ciudad de México  5690.831
## 6      Raven    M   21         Veracruz  9005.739
## 7     Glenys    F   23 Ciudad de México  7290.799
## 8         Li    F   23 Ciudad de México  7311.991
## 9      Miana    F   20           Puebla  9025.571
## 10    Sewell    M   25         Veracruz  7715.227
## 11   Wayland    M   23 Ciudad de México  6779.282
## 12    Nadean    F   23           Puebla  8181.303
## 13  Gregoria    F   24       Nuevo León  7861.109
## 14    Sumiye    F   24           Puebla  8005.764
## 15   Norvell    M   25        Querétaro  8385.280
## 16    Shelle    F   18       Nuevo León  7629.340
## 17  Caldonia    F   23       Nuevo León  8644.377
## 18      Aivy    F   19           Puebla  7779.513
## 19  Ethelmae    F   18        Querétaro  8331.782
## 20      Leah    M   19        Querétaro  9096.839
is.data.frame(df_estudiantes)
## [1] TRUE
View(df_estudiantes)


Agregar nuevas columnas

Una vez creado el data frame, puedes agregar más columnas como estatura, peso, etc.:

# Generamos un vector aleatorio de estaturas
estatura <- round(rnorm(20, 1.6, .15),1)

# Generamos un vector aleatorio de pesos
peso <- round(rnorm(20, 70, 20),2)

df_estudiantes1 <- data.frame(df_estudiantes, 
                              Estatura = estatura,
                              Peso = peso)
df_estudiantes1
##       Nombre Sexo Edad           Estado   Ingreso Estatura   Peso
## 1     Angela    F   24         Veracruz  8053.004      1.7  36.64
## 2      Essie    M   19       Nuevo León  8922.267      1.6  62.40
## 3      Allyn    M   21       Nuevo León 10050.085      1.8  88.38
## 4     Tanita    F   24           Puebla  7508.969      1.7  58.49
## 5  Sherriann    F   25 Ciudad de México  5690.831      1.7  82.16
## 6      Raven    M   21         Veracruz  9005.739      1.6  37.64
## 7     Glenys    F   23 Ciudad de México  7290.799      1.5  68.89
## 8         Li    F   23 Ciudad de México  7311.991      1.8  80.39
## 9      Miana    F   20           Puebla  9025.571      1.5  76.02
## 10    Sewell    M   25         Veracruz  7715.227      1.9  72.11
## 11   Wayland    M   23 Ciudad de México  6779.282      1.8  57.19
## 12    Nadean    F   23           Puebla  8181.303      1.6  53.01
## 13  Gregoria    F   24       Nuevo León  7861.109      1.4  49.52
## 14    Sumiye    F   24           Puebla  8005.764      1.5  72.35
## 15   Norvell    M   25        Querétaro  8385.280      1.6  51.05
## 16    Shelle    F   18       Nuevo León  7629.340      1.6  60.19
## 17  Caldonia    F   23       Nuevo León  8644.377      1.5  64.88
## 18      Aivy    F   19           Puebla  7779.513      1.5 106.88
## 19  Ethelmae    F   18        Querétaro  8331.782      1.6  56.96
## 20      Leah    M   19        Querétaro  9096.839      1.5  74.71
carrera <- c("Actuaría", "Economía", "Matemáticas", "Administración", "Ingeniería Mecatrónica")

carrera_estudiantes <- sample(carrera, 20, replace = T, prob = c(.55,.15,.5,.5,.2))

carrera_estudiantes
##  [1] "Matemáticas"            "Administración"         "Actuaría"              
##  [4] "Matemáticas"            "Matemáticas"            "Ingeniería Mecatrónica"
##  [7] "Economía"               "Ingeniería Mecatrónica" "Administración"        
## [10] "Economía"               "Matemáticas"            "Administración"        
## [13] "Matemáticas"            "Matemáticas"            "Actuaría"              
## [16] "Matemáticas"            "Ingeniería Mecatrónica" "Actuaría"              
## [19] "Actuaría"               "Actuaría"
df_estudiantes1$Carrera <- carrera_estudiantes
# Solo para añadir nuevas columnas en dataframes existentes
df_estudiantes1
##       Nombre Sexo Edad           Estado   Ingreso Estatura   Peso
## 1     Angela    F   24         Veracruz  8053.004      1.7  36.64
## 2      Essie    M   19       Nuevo León  8922.267      1.6  62.40
## 3      Allyn    M   21       Nuevo León 10050.085      1.8  88.38
## 4     Tanita    F   24           Puebla  7508.969      1.7  58.49
## 5  Sherriann    F   25 Ciudad de México  5690.831      1.7  82.16
## 6      Raven    M   21         Veracruz  9005.739      1.6  37.64
## 7     Glenys    F   23 Ciudad de México  7290.799      1.5  68.89
## 8         Li    F   23 Ciudad de México  7311.991      1.8  80.39
## 9      Miana    F   20           Puebla  9025.571      1.5  76.02
## 10    Sewell    M   25         Veracruz  7715.227      1.9  72.11
## 11   Wayland    M   23 Ciudad de México  6779.282      1.8  57.19
## 12    Nadean    F   23           Puebla  8181.303      1.6  53.01
## 13  Gregoria    F   24       Nuevo León  7861.109      1.4  49.52
## 14    Sumiye    F   24           Puebla  8005.764      1.5  72.35
## 15   Norvell    M   25        Querétaro  8385.280      1.6  51.05
## 16    Shelle    F   18       Nuevo León  7629.340      1.6  60.19
## 17  Caldonia    F   23       Nuevo León  8644.377      1.5  64.88
## 18      Aivy    F   19           Puebla  7779.513      1.5 106.88
## 19  Ethelmae    F   18        Querétaro  8331.782      1.6  56.96
## 20      Leah    M   19        Querétaro  9096.839      1.5  74.71
##                   Carrera
## 1             Matemáticas
## 2          Administración
## 3                Actuaría
## 4             Matemáticas
## 5             Matemáticas
## 6  Ingeniería Mecatrónica
## 7                Economía
## 8  Ingeniería Mecatrónica
## 9          Administración
## 10               Economía
## 11            Matemáticas
## 12         Administración
## 13            Matemáticas
## 14            Matemáticas
## 15               Actuaría
## 16            Matemáticas
## 17 Ingeniería Mecatrónica
## 18               Actuaría
## 19               Actuaría
## 20               Actuaría



Operaciones entre columnas

La función attach() nos permite tener acceso a las columnas del data frame para poder operar entre ellas. Mientras, que la función detach() es útil para cerrar el data frame cuando ya no queremos tener acceso a las columnas.

babynames$name[3]
## [1] "Emma"
# name[3]

attach(babynames)
# R agrega el dataframe al "search path" (ruta de búsqueda). Esto significa que las columnas del dataframe se vuelven accesibles como si fueran variables sueltas en el entorno de trabajo.
name[3]
## [1] "Emma"
detach(babynames)

attach(df_estudiantes1)

# Calculamos el IMC de los estudiantes
imc <- round(Peso / (Estatura ^2),2)

df_estudiantes1$IMC <- imc

# Podemos generar un histograma del IMC
hist(df_estudiantes1$IMC)

?hist
# Con esta exploración y a través de la inferencia estadística, podemos hacer pruebas de bondad de ajuste y determinar a qué distribución se ajustan los datos


# Cerramos el acceso al dataframe
detach(df_estudiantes1)

Alternativamente, puedes operar directamente sobre las columnas sin usar attach() y detach():

# Generamos calificaciones para tres exámenes
set.seed(123)

calif1 <- round(runif(20, 5, 10),0)
calif2 <- round(runif(20, 5, 10),0)
calif3 <- round(runif(20, 5, 10),0)

# Añadimos las calificaciones a nuestro df
df_estudiantes1$Examen1 <- calif1

# Podemos lograr esto de una manera más rápida con índices
df_estudiantes1[ ,"Peso"]
##  [1]  36.64  62.40  88.38  58.49  82.16  37.64  68.89  80.39  76.02  72.11
## [11]  57.19  53.01  49.52  72.35  51.05  60.19  64.88 106.88  56.96  74.71
df_estudiantes1[,c("Nombre","Edad")]
##       Nombre Edad
## 1     Angela   24
## 2      Essie   19
## 3      Allyn   21
## 4     Tanita   24
## 5  Sherriann   25
## 6      Raven   21
## 7     Glenys   23
## 8         Li   23
## 9      Miana   20
## 10    Sewell   25
## 11   Wayland   23
## 12    Nadean   23
## 13  Gregoria   24
## 14    Sumiye   24
## 15   Norvell   25
## 16    Shelle   18
## 17  Caldonia   23
## 18      Aivy   19
## 19  Ethelmae   18
## 20      Leah   19
df_estudiantes1[,c("Examen2","Examen3")] <- cbind(calif2,calif3)

# View(df_estudiantes1)

# Otra alternativa
# df_estudiante1 <- cbind(df_estudiantes1,
#                        "Examen1" = calif1,
#                        "Examen2" = calif2,
#                        "Examen3" = calif3)


promedio <- round((df_estudiantes1$Examen1 + df_estudiantes1$Examen2 + df_estudiantes1$Examen3) / 3, 2)

promedio
##  [1] 7.00 8.00 7.33 8.67 8.00 6.67 7.33 8.00 6.67 7.33 8.33 8.00 8.33 7.67 6.33
## [16] 7.33 7.00 6.67 7.67 7.67
df_estudiantes1$Promedio <- promedio

df_estudiantes1
##       Nombre Sexo Edad           Estado   Ingreso Estatura   Peso
## 1     Angela    F   24         Veracruz  8053.004      1.7  36.64
## 2      Essie    M   19       Nuevo León  8922.267      1.6  62.40
## 3      Allyn    M   21       Nuevo León 10050.085      1.8  88.38
## 4     Tanita    F   24           Puebla  7508.969      1.7  58.49
## 5  Sherriann    F   25 Ciudad de México  5690.831      1.7  82.16
## 6      Raven    M   21         Veracruz  9005.739      1.6  37.64
## 7     Glenys    F   23 Ciudad de México  7290.799      1.5  68.89
## 8         Li    F   23 Ciudad de México  7311.991      1.8  80.39
## 9      Miana    F   20           Puebla  9025.571      1.5  76.02
## 10    Sewell    M   25         Veracruz  7715.227      1.9  72.11
## 11   Wayland    M   23 Ciudad de México  6779.282      1.8  57.19
## 12    Nadean    F   23           Puebla  8181.303      1.6  53.01
## 13  Gregoria    F   24       Nuevo León  7861.109      1.4  49.52
## 14    Sumiye    F   24           Puebla  8005.764      1.5  72.35
## 15   Norvell    M   25        Querétaro  8385.280      1.6  51.05
## 16    Shelle    F   18       Nuevo León  7629.340      1.6  60.19
## 17  Caldonia    F   23       Nuevo León  8644.377      1.5  64.88
## 18      Aivy    F   19           Puebla  7779.513      1.5 106.88
## 19  Ethelmae    F   18        Querétaro  8331.782      1.6  56.96
## 20      Leah    M   19        Querétaro  9096.839      1.5  74.71
##                   Carrera   IMC Examen1 Examen2 Examen3 Promedio
## 1             Matemáticas 12.68       6       9       6     7.00
## 2          Administración 24.37       9       8       7     8.00
## 3                Actuaría 27.28       7       8       7     7.33
## 4             Matemáticas 20.24       9      10       7     8.67
## 5             Matemáticas 28.43      10       8       6     8.00
## 6  Ingeniería Mecatrónica 14.70       5       9       6     6.67
## 7                Economía 30.62       8       8       6     7.33
## 8  Ingeniería Mecatrónica 24.81       9       8       7     8.00
## 9          Administración 33.79       8       6       6     6.67
## 10               Economía 19.98       7       6       9     7.33
## 11            Matemáticas 17.65      10      10       5     8.33
## 12         Administración 20.71       7      10       7     8.00
## 13            Matemáticas 25.27       8       8       9     8.33
## 14            Matemáticas 32.16       8       9       6     7.67
## 15               Actuaría 19.94       6       5       8     6.33
## 16            Matemáticas 23.51       9       7       6     7.33
## 17 Ingeniería Mecatrónica 28.84       6       9       6     7.00
## 18               Actuaría 47.50       5       6       9     6.67
## 19               Actuaría 22.25       7       7       9     7.67
## 20               Actuaría 33.20      10       6       7     7.67


Podemos exportar el dataframe a un archivo Excel usando el paquete openxlsx:

# install.packages("openxlsx")

library(openxlsx) # Exporta dataframes como archivos de excel

openxlsx::write.xlsx(df_estudiantes1, "Base_estudiantes.xlsx")

getwd()
## [1] "C:/Users/sofip/Downloads/Curso R/Clase4"
# Nos da como resultado el directorio de trabajo actual
# El directorio de trabajo normalmente es la carpeta donde está el archivo .Rmd.


Podemos cambiar el directorio de trabajo con la función setwd().

setwd("C:/Users/sofip/Desktop")
# Cambia el directorio de trabajo actual y lo establece en donde indiquemos

getwd()
## [1] "C:/Users/sofip/Desktop"
openxlsx::write.xlsx(df_estudiantes1, "Base_estudiantes2.xlsx")


También podemos exportar los gráficos que generamos a partir del dataframe.

png("graficos-promedio.png", width = 800, height = 600)

hist(df_estudiantes1$Promedio)

dev.off()
## png 
##   2
# dev.off() es el paso que confirma y cierra la exportación del gráfico al archivo. 
# Sin dev.off(), el archivo puede quedar incompleto o no guardarse correctamente, porque R no “finaliza” la escritura del gráfico. 



Biblioteca Dplyr

La biblioteca dplyr es una de las más populares y poderosas en R para la manipulación de datos. Forma parte del tidyverse, un conjunto de paquetes diseñados para facilitar el análisis de datos. Proporciona una gramática coherente para trabajar con data frames, permitiendo realizar operaciones complejas de manera concisa y legible, facilitando su aplicación.

Intalación y carga de las librerías

# install.packages(c("dplyr","readxl"))

library(dplyr)
library(readxl)


Importamos la base de datos de dulces M&M

getwd()
## [1] "C:/Users/sofip/Downloads/Curso R/Clase4"
DulcesM_M <- read_excel("DulcesM&M.xlsx")

is.data.frame(DulcesM_M)
## [1] TRUE
View(DulcesM_M)

# head devuelve las primeras filas
head(DulcesM_M)
## # A tibble: 6 × 2
##   Color     Peso
##   <chr>    <dbl>
## 1 Rojo     0.751
## 2 Naranja  0.735
## 3 Amarillo 0.883
## 4 Café     0.696
## 5 Azul     0.881
## 6 Verde    0.925


Principales funciones de dplyr

  1. select: Selecciona columnas específicas de un data frame. Es útil cuando queremos trabajar con una parte específica de los datos, por ejemplo, seleccionar solo la columna de pesos de los dulces.
variable_peso <- select(DulcesM_M,2) # Genera dataframe

variable_peso
## # A tibble: 100 × 1
##     Peso
##    <dbl>
##  1 0.751
##  2 0.735
##  3 0.883
##  4 0.696
##  5 0.881
##  6 0.925
##  7 0.841
##  8 0.895
##  9 0.769
## 10 0.876
## # ℹ 90 more rows
variable_peso2 <- DulcesM_M$Peso # Genera vector
variable_peso2
##   [1] 0.751 0.735 0.883 0.696 0.881 0.925 0.841 0.895 0.769 0.876 0.863 0.914
##  [13] 0.856 0.865 0.859 0.855 0.775 0.881 0.799 0.864 0.784 0.806 0.854 0.865
##  [25] 0.966 0.852 0.824 0.840 0.810 0.865 0.859 0.866 0.858 0.868 0.858 1.015
##  [37] 0.857 0.859 0.848 0.859 0.818 0.876 0.942 0.838 0.851 0.982 0.868 0.809
##  [49] 0.873 0.863 0.803 0.865 0.809 0.888 0.932 0.848 0.890 0.925 0.842 0.940
##  [61] 0.878 0.793 0.832 0.833 0.905 0.977 0.807 0.845 0.850 0.852 0.852 0.830
##  [73] 0.778 0.778 0.856 0.814 0.814 0.842 0.791 0.791 0.778 0.810 0.810 0.786
##  [85] 0.881 0.881 0.853 0.818 0.864 0.864 0.873 0.825 0.880 0.855 0.882 0.942
##  [97] 0.931 0.825 0.869 0.912
is.data.frame(variable_peso2)
## [1] FALSE
is.vector(variable_peso2)
## [1] TRUE
is.data.frame(variable_peso)
## [1] TRUE


  1. filter: filtra filas según una condición lógica. Esta función es clave cuando queremos segmentar los datos. Por ejemplo, seleccionar solo los dulces rojos o aquellos que cumplen cierto criterio específico.
# Filtramos los dulces de color rojo
dulces_rojos <- filter(DulcesM_M, Color == "Rojo")
dulces_rojos
## # A tibble: 13 × 2
##    Color  Peso
##    <chr> <dbl>
##  1 Rojo  0.751
##  2 Rojo  0.841
##  3 Rojo  0.856
##  4 Rojo  0.799
##  5 Rojo  0.966
##  6 Rojo  0.859
##  7 Rojo  0.857
##  8 Rojo  0.942
##  9 Rojo  0.873
## 10 Rojo  0.809
## 11 Rojo  0.89 
## 12 Rojo  0.878
## 13 Rojo  0.905
# Filtramos dulces rojos con peso mayor a 0.9 gramos
dulces_rojos_pesados <- filter(DulcesM_M, Color == "Rojo",Peso > 0.9)
dulces_rojos_pesados
## # A tibble: 3 × 2
##   Color  Peso
##   <chr> <dbl>
## 1 Rojo  0.966
## 2 Rojo  0.942
## 3 Rojo  0.905


  1. arrange: ordena las filas del data frame. Sirve para organizar los datos de forma ascendente o descendente, lo cual es muy útil para informes o análisis.
# Ordenar por color
dulces_ord_color <- arrange(DulcesM_M, Color)
dulces_ord_color
## # A tibble: 100 × 2
##    Color     Peso
##    <chr>    <dbl>
##  1 Amarillo 0.883
##  2 Amarillo 0.769
##  3 Amarillo 0.859
##  4 Amarillo 0.784
##  5 Amarillo 0.824
##  6 Amarillo 0.858
##  7 Amarillo 0.848
##  8 Amarillo 0.851
##  9 Azul     0.881
## 10 Azul     0.863
## # ℹ 90 more rows
# Ordenar por peso de menor a mayor
dulces_ord_peso1 <- arrange(DulcesM_M, Peso)
dulces_ord_peso1
## # A tibble: 100 × 2
##    Color     Peso
##    <chr>    <dbl>
##  1 Café     0.696
##  2 Naranja  0.735
##  3 Rojo     0.751
##  4 Amarillo 0.769
##  5 Azul     0.775
##  6 Azul     0.778
##  7 Verde    0.778
##  8 Naranja  0.778
##  9 Amarillo 0.784
## 10 Naranja  0.786
## # ℹ 90 more rows
# Ordenar por peso de mayor a menor
dulces_ord_peso2 <- arrange(DulcesM_M, desc(Peso))
dulces_ord_peso2
## # A tibble: 100 × 2
##    Color    Peso
##    <chr>   <dbl>
##  1 Verde   1.01 
##  2 Café    0.982
##  3 Naranja 0.977
##  4 Rojo    0.966
##  5 Rojo    0.942
##  6 Azul    0.942
##  7 Verde   0.94 
##  8 Azul    0.932
##  9 Naranja 0.931
## 10 Verde   0.925
## # ℹ 90 more rows


  1. mutate: Crea nuevas columnas o transforma las ya existentes. Permite modificar el data frame añadiendo nuevas columnas basadas en cálculos o transformaciones.
set.seed(123)

dulces_modificado <- mutate(DulcesM_M,
                            Volumen = round(rnorm(n(),mean=0.6,sd=0.1),2))

head(dulces_modificado)
## # A tibble: 6 × 3
##   Color     Peso Volumen
##   <chr>    <dbl>   <dbl>
## 1 Rojo     0.751    0.54
## 2 Naranja  0.735    0.58
## 3 Amarillo 0.883    0.76
## 4 Café     0.696    0.61
## 5 Azul     0.881    0.61
## 6 Verde    0.925    0.77


  1. count: Cuenta las ocurrencias por grupo. Ideal para ver frecuencias de alguna variable categórica, como los colores en el dataset.
# Contamos la cantidad de dulces que hay de cada color
conteo_dulces <- count(DulcesM_M, Color)
conteo_dulces
## # A tibble: 6 × 2
##   Color        n
##   <chr>    <int>
## 1 Amarillo     8
## 2 Azul        27
## 3 Café         8
## 4 Naranja     25
## 5 Rojo        13
## 6 Verde       19
is.data.frame(conteo_dulces)
## [1] TRUE
table(DulcesM_M$Color)
## 
## Amarillo     Azul     Café  Naranja     Rojo    Verde 
##        8       27        8       25       13       19
is.table(table(DulcesM_M$Color))
## [1] TRUE
# table es una estructura diseñada específicamente para almacenar frecuencias de valores categóricos y suele convertirse fácilmente a vector, matriz o dataframe 
# con as.vector(), as.matrix(), as.dataframe()

as.matrix(table(DulcesM_M$Color))
##          [,1]
## Amarillo    8
## Azul       27
## Café        8
## Naranja    25
## Rojo       13
## Verde      19


  1. summarise: Genera resúmenes estadísticos. Permite calcular estadísticas como medias, varianzas o sumas, etc. facilitando el análisis de datos.
resumen <- summarise(DulcesM_M, 
                     Promedio = mean(Peso), 
                     Varianza = var(Peso), 
                     Desviación = sd(Peso),
                     Mediana = median(Peso),
                     Total = n())

resumen
## # A tibble: 1 × 5
##   Promedio Varianza Desviación Mediana Total
##      <dbl>    <dbl>      <dbl>   <dbl> <int>
## 1    0.853  0.00273     0.0523   0.856   100


  1. group_by: Agrupa el data frame por una o más variables. Cuando queremos realizar análisis estadístico por grupos, como promedio de peso por color.
grupo_colores <- group_by(DulcesM_M, Color)

resumen_color <- summarise(grupo_colores,
                           Promedio = mean(Peso), 
                     Varianza = var(Peso), 
                     Desviación = sd(Peso),
                     Mediana = median(Peso),
                     Total = n())

resumen_color
## # A tibble: 6 × 6
##   Color    Promedio Varianza Desviación Mediana Total
##   <chr>       <dbl>    <dbl>      <dbl>   <dbl> <int>
## 1 Amarillo    0.834  0.00156     0.0395   0.849     8
## 2 Azul        0.844  0.00183     0.0428   0.842    27
## 3 Café        0.848  0.00632     0.0795   0.857     8
## 4 Naranja     0.858  0.00251     0.0501   0.863    25
## 5 Rojo        0.864  0.00332     0.0576   0.859    13
## 6 Verde       0.864  0.00324     0.0570   0.865    19


  1. Piping (%>%). El operador %>% facilita la escritura fluida y clara de código en R, permitiendo encadenar operaciones sin necesidad de crear variables intermedias.
DulcesM_M %>% 
  group_by(Color) %>% 
  summarise(Promedio = mean(Peso),
            Varianza = var(Peso),
            Desviación = sd(Peso),
            Mediana = median(Peso),
            Total = n()) %>% 
  arrange(desc(Total)) %>% 
  print()
## # A tibble: 6 × 6
##   Color    Promedio Varianza Desviación Mediana Total
##   <chr>       <dbl>    <dbl>      <dbl>   <dbl> <int>
## 1 Azul        0.844  0.00183     0.0428   0.842    27
## 2 Naranja     0.858  0.00251     0.0501   0.863    25
## 3 Verde       0.864  0.00324     0.0570   0.865    19
## 4 Rojo        0.864  0.00332     0.0576   0.859    13
## 5 Amarillo    0.834  0.00156     0.0395   0.849     8
## 6 Café        0.848  0.00632     0.0795   0.857     8