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
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
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
Imaginemos que después de calcular los pagos mensuales, la gerencia quiere responder algunas preguntas específicas:
Las bibliotecas en R, también conocidas como libraries, contienien 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)?dplyrPara saber qué bibliotecas hemos cargado podemos consultar la sección
miscelánea o en la consola usar la función search( ).
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:
Continuamos con los dataframes.
Los data frames 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 data frames 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:
Mi primer Data Frame
Para crear un data frame se utiliza la función data.frame().
A continuación se muestra un ejemplo de cómo crear un data frame con datos aleatorios de estudiantes, que incluye nombres, sexo, edades, estados 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
dim(babynames)
## [1] 1924665 5
indices <- sample(1:length(babynames$name), 20, replace = FALSE)
indices
## [1] 1237518 134058 1172598 685285 1274894 1413785 1697371 1242203 1618268
## [10] 1638025 1881443 497690 402858 583422 1231780 883281 669543 1325900
## [19] 944672 613997
nombre <- babynames$name[indices]
nombre
## [1] "Kemba" "Orean" "Kirstyn" "Amparo" "Belen" "Rayshaun"
## [7] "Brazil" "Chaston" "Reyn" "Ogechi" "Raylin" "Elisha"
## [13] "Francico" "Theoplis" "Ashea" "Angela" "Essie" "Allyn"
## [19] "Tanita" "Sherriann"
is.data.frame(nombre)
## [1] FALSE
is.vector(nombre)
## [1] TRUE
sexo <- babynames$sex[indices]
sexo
## [1] "F" "F" "F" "F" "M" "M" "F" "M" "M" "F" "M" "F" "M" "M" "F" "F" "M" "M" "F"
## [20] "F"
edad <- sample(18:25,20,replace = TRUE)
edad
## [1] 24 18 18 19 24 20 21 22 24 22 20 25 23 18 19 22 22 25 21 24
estado <- c("Ciudad de México", "Querétaro", "Puebla", "Veracruz")
estado_procedencia <- sample(estado, 20, replace = T)
estado_procedencia
## [1] "Ciudad de México" "Querétaro" "Ciudad de México" "Ciudad de México"
## [5] "Puebla" "Ciudad de México" "Querétaro" "Ciudad de México"
## [9] "Puebla" "Ciudad de México" "Puebla" "Querétaro"
## [13] "Veracruz" "Puebla" "Veracruz" "Veracruz"
## [17] "Querétaro" "Querétaro" "Puebla" "Veracruz"
ingreso <- floor(rnorm(20, 8000, 1000))
ingreso
## [1] 6734 10168 9207 6876 7597 7533 8779 7916 8253 7971 7957 9368
## [13] 7774 9516 6451 8584 8123 8215 8379 7497
df_estudiantes <- data.frame(Nombre = nombre, Sexo = sexo, Edad = edad, Estado = estado_procedencia, Ingreso = ingreso)
# View(df_estudiantes)
df_estudiantes
## Nombre Sexo Edad Estado Ingreso
## 1 Kemba F 24 Ciudad de México 6734
## 2 Orean F 18 Querétaro 10168
## 3 Kirstyn F 18 Ciudad de México 9207
## 4 Amparo F 19 Ciudad de México 6876
## 5 Belen M 24 Puebla 7597
## 6 Rayshaun M 20 Ciudad de México 7533
## 7 Brazil F 21 Querétaro 8779
## 8 Chaston M 22 Ciudad de México 7916
## 9 Reyn M 24 Puebla 8253
## 10 Ogechi F 22 Ciudad de México 7971
## 11 Raylin M 20 Puebla 7957
## 12 Elisha F 25 Querétaro 9368
## 13 Francico M 23 Veracruz 7774
## 14 Theoplis M 18 Puebla 9516
## 15 Ashea F 19 Veracruz 6451
## 16 Angela F 22 Veracruz 8584
## 17 Essie M 22 Querétaro 8123
## 18 Allyn M 25 Querétaro 8215
## 19 Tanita F 21 Puebla 8379
## 20 Sherriann F 24 Veracruz 7497
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),2)
estatura
## [1] 1.55 1.45 1.44 1.65 1.67 1.61 1.74 1.91 1.53 1.25 1.75 1.49 1.50 1.75 1.56
## [16] 1.42 1.63 1.58 1.60 1.66
peso <- round(rnorm(20, 70, 20))
peso
## [1] 63 83 66 77 92 79 63 93 90 81 75 57 97 58 114 101 65 49 56
## [20] 75
df_estudiantes1 <- data.frame(df_estudiantes,
Estatura = estatura,
Peso = peso)
df_estudiantes1
## Nombre Sexo Edad Estado Ingreso Estatura Peso
## 1 Kemba F 24 Ciudad de México 6734 1.55 63
## 2 Orean F 18 Querétaro 10168 1.45 83
## 3 Kirstyn F 18 Ciudad de México 9207 1.44 66
## 4 Amparo F 19 Ciudad de México 6876 1.65 77
## 5 Belen M 24 Puebla 7597 1.67 92
## 6 Rayshaun M 20 Ciudad de México 7533 1.61 79
## 7 Brazil F 21 Querétaro 8779 1.74 63
## 8 Chaston M 22 Ciudad de México 7916 1.91 93
## 9 Reyn M 24 Puebla 8253 1.53 90
## 10 Ogechi F 22 Ciudad de México 7971 1.25 81
## 11 Raylin M 20 Puebla 7957 1.75 75
## 12 Elisha F 25 Querétaro 9368 1.49 57
## 13 Francico M 23 Veracruz 7774 1.50 97
## 14 Theoplis M 18 Puebla 9516 1.75 58
## 15 Ashea F 19 Veracruz 6451 1.56 114
## 16 Angela F 22 Veracruz 8584 1.42 101
## 17 Essie M 22 Querétaro 8123 1.63 65
## 18 Allyn M 25 Querétaro 8215 1.58 49
## 19 Tanita F 21 Puebla 8379 1.60 56
## 20 Sherriann F 24 Veracruz 7497 1.66 75
carrera <- c("Actuaría", "Economía", "Matemáticas", "Administración")
carrera_est <- sample(carrera, 20, replace = T, prob = c(.55,.15,.15,.15))
carrera_est
## [1] "Actuaría" "Economía" "Actuaría" "Actuaría"
## [5] "Actuaría" "Actuaría" "Actuaría" "Actuaría"
## [9] "Actuaría" "Matemáticas" "Actuaría" "Administración"
## [13] "Actuaría" "Actuaría" "Administración" "Economía"
## [17] "Actuaría" "Economía" "Administración" "Matemáticas"
df_estudiantes1$Carrera <- carrera_est
# Solo para añadir nuevas columnas en dataframes existentes
df_estudiantes1
## Nombre Sexo Edad Estado Ingreso Estatura Peso Carrera
## 1 Kemba F 24 Ciudad de México 6734 1.55 63 Actuaría
## 2 Orean F 18 Querétaro 10168 1.45 83 Economía
## 3 Kirstyn F 18 Ciudad de México 9207 1.44 66 Actuaría
## 4 Amparo F 19 Ciudad de México 6876 1.65 77 Actuaría
## 5 Belen M 24 Puebla 7597 1.67 92 Actuaría
## 6 Rayshaun M 20 Ciudad de México 7533 1.61 79 Actuaría
## 7 Brazil F 21 Querétaro 8779 1.74 63 Actuaría
## 8 Chaston M 22 Ciudad de México 7916 1.91 93 Actuaría
## 9 Reyn M 24 Puebla 8253 1.53 90 Actuaría
## 10 Ogechi F 22 Ciudad de México 7971 1.25 81 Matemáticas
## 11 Raylin M 20 Puebla 7957 1.75 75 Actuaría
## 12 Elisha F 25 Querétaro 9368 1.49 57 Administración
## 13 Francico M 23 Veracruz 7774 1.50 97 Actuaría
## 14 Theoplis M 18 Puebla 9516 1.75 58 Actuaría
## 15 Ashea F 19 Veracruz 6451 1.56 114 Administración
## 16 Angela F 22 Veracruz 8584 1.42 101 Economía
## 17 Essie M 22 Querétaro 8123 1.63 65 Actuaría
## 18 Allyn M 25 Querétaro 8215 1.58 49 Economía
## 19 Tanita F 21 Puebla 8379 1.60 56 Administración
## 20 Sherriann F 24 Veracruz 7497 1.66 75 Matemáticas
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.
attach(df_estudiantes1)
# 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.
# Calculamos el IMC de los estudiantes
imc <- round(Peso / (Estatura ^ 2),2)
df_estudiantes1$IMC <- imc
View(df_estudiantes1)
# Podemos generar un histograma del IMC
hist(df_estudiantes1$IMC)
# 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] 63 83 66 77 92 79 63 93 90 81 75 57 97 58 114 101 65 49 56
## [20] 75
df_estudiantes1[,c("Examen2", "Examen3")] <- cbind(calif2, calif3)
View(df_estudiantes1)
# Otra alternativa
# df_estudiantes1 <- cbind(df_estudiantes1,
# "Examen 1" = calif1,
# "Examen 2" = calif2,
# "Examen 3" = 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
View(df_estudiantes1)
Puedes exportar el data frame 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"
# 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_estudiantes.xlsx")
También podemos exportar los gráficos que generamos a partir del dataframe.
getwd()
## [1] "C:/Users/sofip/Downloads"
png("grafico-promedios.png", width = 800, height = 600)
hist(df_estudiantes1$Promedio)
dev.off()
## png
## 2
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)
##
## 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
library(readxl)
Importamos la base de datos de dulces M&M
getwd()
## [1] "C:/Users/sofip/Downloads"
DulcesM_M <- read_excel("DulcesM&M.xlsx")
View(DulcesM_M)
# Podemos explorar 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
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
is.data.frame(variable_peso2)
## [1] FALSE
is.vector(variable_peso2)
## [1] TRUE
is.data.frame(variable_peso)
## [1] TRUE
# 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
# 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
set.seed(123)
dulces_modificado <- mutate(DulcesM_M, Volumen = round(rnorm(n(), mean = 0.6, sd = 0.1),2))
dulces_modificado
## # A tibble: 100 × 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
## 7 Rojo 0.841 0.65
## 8 Naranja 0.895 0.47
## 9 Amarillo 0.769 0.53
## 10 Café 0.876 0.56
## # ℹ 90 more rows
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
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
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
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