Í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


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:

  1. ¿Cuál es el pago mensual del Modelo B para un plazo de 48 meses?


  1. ¿Cuáles son los pagos mensuales para todos los modelos cuando el plazo es de 60 y 72 meses?


  1. ¿Para qué modelo y en qué plazo se registra el pago mensual más bajo?



Bibliotecas en R

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)
  • ?dplyr

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


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 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:

  1. Dimensiones: Los data frame 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 data frames permiten acceder, modificar, y operar sobre sus elementos de manera eficiente usando diversas funciones en R.

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



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)
## 
## 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

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

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))
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

5. count: Cuénta 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