Manual Introductorio a R

¿Qué es R?

R es una plataforma para el análisis y graficación de datos. R utiliza como base el lenguaje S, desarrollado por John Chambers y colaboradores (Becker et al., 1988; Chambers and Hastie, 1992; Chambers et al., 1998) en los Laboratorios Bell (anteriormente AT&T, ahora pertenece a Lucent Technologies) a inicios de los años 1960s. El lenguaje S fue diseñado y desarrollado como un lenguaje de programación para realizar funciones de análisis de datos.

El desarrollo del sistema R para estadística computacional esta influenciado por la idea de “fuentes de libre acceso”: Las funciones base de R y un gran número de contribuciones (extensiones) están disponibles bajo los términos de Fundación de Software Libre. Esta licencia tiene dos implicaciones importantes para analistas de datos que trabajan con R. Todos los códigos completos están disponibles y son de acceso libre para todos. Entonces cualquier persona puede examinar, editar y manipular el códido de acuerdo a sus necesidades. Esto ha hecho que R se haya vuelta tan popular y flexible.

La distribución base de R es mantenida por un pequeño grupo de estadísticos, denominados “R Development Core Team”. Una gran cantidad de funciones adicionales y extensiones han sido creadas y mantenidas por otras personas voluntarias que colaboran del proyecto R.


Instalación de R / RStudio

La fuente principal de información acerca de este sistema se encuentra en el sitio web oficial del proyectoR (R Project). RStudio es un entorno de desarrollo integrado (IDE) para el lenguaje de programación R, dedicado al análisis estadístico y gráficación. RStudio tiene la misión de proporcionar el entorno informático estadístico R, el cual permite un análisis y desarrollo para que cualquiera pueda analizar los datos con R.

En general, recomendamos utilizar la plataforma R en conjunto con RStudio, que es una plataforma dinámica y un poco más amigable mediante la cual podemos guardar nuestros códigos, ejecutar comandos y visualizar los resultados.

Para instalar R y RStudio podemos seguir los pasos en el siguiente enlace: (Instalación de R) o mediante el siguiente video:



Paquetes / librerías

La instalación de R contiene varios paquetes o librerías asociadas. Algunas de ellas son parte de la instalación base, otras pueden ser descargadas por medio del portal CRAN.



El portal CRAN tiene acceso a +1000 paquetes para diferentes propósitos. Además, mucha gente continua actualizando y copilando paquetes específicos que también pueden ser accesados vía CRAN o por otros portales. R viene pre-instalado con algunos paquetes “base” por lo que no es necesario tener cargados todos los paquetes existentes al mismo tiempo. Generalmente uno carga únicamente los paquetes que va ocupando en los distintos análisis.

Estos son algunos enlances en donde podemos accesar información de como instalar paquetes/librerías de R, o de los paquetes disponibles:

Además, podemos instalar paquetes o librerías de forma automatizada usando el siguiente código en nuestra consola o editor de RStudio (Fig. 1):

Figura 1. Esquema de paneles de RStudio


install.packages("car")
install.packages("ggplot2")

Una vez que tenemos instalado un paquete o librería, debemos cargarlo. El simple hecho de tener un paquete instalado no significa que ya el paquete es funcional dentro de nuestra plataforma de trabajo. Para esto, podemos utilizar R podemos utilizar el siguiente código en nuestra consola o editor de RStudio:


library(car)
library(reshape2)
library(ggplot2)

¿Cómo pedir ayuda en R?

R tiene varias formas en las que podemos pedir ayuda. Lo más sencillo si estamos usando RStudio es accesar la pestaña de ayuda. Ahí podemos introducir el nombre de una función o prueba estadística para poder tener más información. Desde la consola de comandos también podemos usar varias funciones para que pueden accesar la documentación dentro de los paquetes/librerías de R.



Algunas de las funciones que podemos utilizar desde nuestra consola o editor de RStudio son:

help(mean) 
?mean
help.search("anova")
apropos("test")

Documentación

Documentación adicional de R está disponible de diferentes fuentes, incluyendo las siguientes:


Sesión de repaso

En esencia, R | RStudio funciona usando un modelo de pregunta-respuesta. Se introduce una línea con un comando (similar a realizar una pregunta) y luego se presiona “Enter” para generar una respuesta. Tanto R como RStudio realizan un proceso (en el fondo) en el que imprimen/presentan la información relevante, o puede pedir más información si hiciera falta. Cuando R | RStudio esta listo para recibir un comando, entonces imprimirá en la consola usando el siguiente símbolo >.

Una de las funciones más simples en R es introducir expresiones aritméticas, del mismo modo que lo hacemos en nuestras calculadoras o en hojas de Excel, por ejemplo:


# Operaciones aritméticas
3 + 2
## [1] 5
10 - 2
## [1] 8
5 * 5
## [1] 25
1 + 2 + 3 + 5 + 15 - (5 * 3)
## [1] 11
4^2
## [1] 16
sqrt(36)
## [1] 6
pi
## [1] 3.141593
exp(1)
## [1] 2.718282

Si quisiéramos visualizar una secuencia de valores, por ejemplo de 3 a 107, podemos usar el siguiente comando:


# Secuencia de 7 a 107 que aumenta de uno a uno
7:107 
##   [1]   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
##  [19]  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
##  [37]  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60
##  [55]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
##  [73]  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
##  [91]  97  98  99 100 101 102 103 104 105 106 107
# También podemos generar una secuencia usando la función "seq"
seq(from = 7, to = 107, by = 1)
##   [1]   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
##  [19]  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
##  [37]  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60
##  [55]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
##  [73]  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
##  [91]  97  98  99 100 101 102 103 104 105 106 107
seq(7, 107, 1)
##   [1]   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
##  [19]  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
##  [37]  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60
##  [55]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
##  [73]  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
##  [91]  97  98  99 100 101 102 103 104 105 106 107
seq(7, 107)
##   [1]   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24
##  [19]  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42
##  [37]  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60
##  [55]  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
##  [73]  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96
##  [91]  97  98  99 100 101 102 103 104 105 106 107
# Ahora generemos una secuencia de 7 a 107, pero que vaya de 2 en 2
seq(7, 107, by = 2)
##  [1]   7   9  11  13  15  17  19  21  23  25  27  29  31  33  35  37  39  41  43
## [20]  45  47  49  51  53  55  57  59  61  63  65  67  69  71  73  75  77  79  81
## [39]  83  85  87  89  91  93  95  97  99 101 103 105 107
# Ahora generemos una secuencia de 7 a 107, pero que vaya de 5 en 5
seq(7, 107, by = 5)
##  [1]   7  12  17  22  27  32  37  42  47  52  57  62  67  72  77  82  87  92  97
## [20] 102 107
# Ahora generemos una secuencia de 7 a 107, cual tendrá una longitud de 10
seq(7, 107, length.out = 100)
##   [1]   7.000000   8.010101   9.020202  10.030303  11.040404  12.050505
##   [7]  13.060606  14.070707  15.080808  16.090909  17.101010  18.111111
##  [13]  19.121212  20.131313  21.141414  22.151515  23.161616  24.171717
##  [19]  25.181818  26.191919  27.202020  28.212121  29.222222  30.232323
##  [25]  31.242424  32.252525  33.262626  34.272727  35.282828  36.292929
##  [31]  37.303030  38.313131  39.323232  40.333333  41.343434  42.353535
##  [37]  43.363636  44.373737  45.383838  46.393939  47.404040  48.414141
##  [43]  49.424242  50.434343  51.444444  52.454545  53.464646  54.474747
##  [49]  55.484848  56.494949  57.505051  58.515152  59.525253  60.535354
##  [55]  61.545455  62.555556  63.565657  64.575758  65.585859  66.595960
##  [61]  67.606061  68.616162  69.626263  70.636364  71.646465  72.656566
##  [67]  73.666667  74.676768  75.686869  76.696970  77.707071  78.717172
##  [73]  79.727273  80.737374  81.747475  82.757576  83.767677  84.777778
##  [79]  85.787879  86.797980  87.808081  88.818182  89.828283  90.838384
##  [85]  91.848485  92.858586  93.868687  94.878788  95.888889  96.898990
##  [91]  97.909091  98.919192  99.929293 100.939394 101.949495 102.959596
##  [97] 103.969697 104.979798 105.989899 107.000000

Si quisieramos repetir elementos, podríamos usar el siguiente comando:

# Repetir el número 2, 3 veces...
rep(2, 3)
## [1] 2 2 2
# Repetir el número 2, 25 veces...
rep(2, 25)
##  [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# Repetir
rep(sqrt(255), 6)
## [1] 15.96872 15.96872 15.96872 15.96872 15.96872 15.96872
rep(10, times = 5)
## [1] 10 10 10 10 10
rep(10, 5)
## [1] 10 10 10 10 10

Objetos

Uno de los procedimientos más comunes en R es el de guardar/almacenar/asignar valores a un objeto. Como cualquier otro lenguaje de computación, R utiliza variables simbólicas para representar valores o resultados. Para esto se utiliza los caracteres <- (esto también equivale al símbolo =), los cuales se deben leer como un símbolo de igual. La flecha apunta a la variable, a la cual asignaremos el valor o conjunto de valores.

También es importante considerar que, aunque no vemos un valor inmediato en la pantalla, nuestro objeto contiene el valor asignado. Si queremos extraer este valor, solo debemos llamar a nuestro objeto. Por ejemplo, si quisiéramos asignar el valor de 10 a la variable “a”, entonces lo podemos expresar así:


# Asignar valores a un objeto
a <- 10

# Evaluar la expresión e imprimir el objeto
a 
## [1] 10
# Podemos realizar operaciones sencillas con nuestra variable
a + 10
## [1] 20
# También podemos hacer operaciones más compleja,
b <- (a + 5)^2 - (a / 2)
b * 5
## [1] 1100

Técnicamente R es un lenguaje de expresión con una sintaxis muy simple. Sin embargo, este lenguaje es sensitivo a cambios de mayúscula. De modo que las variables A y a son distintas.


# R es sensitivo a cambios de mayúscula
A
## Error in eval(expr, envir, enclos): object 'A' not found
# Objeto previamente definido
a
## [1] 10

Para remover un objeto, podemos usar la función “rm(objeto)”.


# Remover objeto
rm(a)
a

# Remover todos los objetos creados!
rm(list = ls())

Un objeto no necesariamente tiene que ser una letra. A veces para recordar una variable asignamos una abreviación que tenga alguna relación con algo que queremos recordar o que estamos haciendo. Por ejemplo:


# Altura (cm)
altura <- 70.5
altura
## [1] 70.5
# Peso (kg)
peso <- 65
peso
## [1] 65
# Operaciones con objetos creados
altura - peso
## [1] 5.5
altura * peso
## [1] 4582.5
(altura + peso) / altura^peso 
## [1] 9.991868e-119

Constantes especiales

Constantes especiales incluyen:

  • NA para datos que no existen o no han sido definidos
  • NULL para objetos en blanco
  • Inf y -Inf para representar números infinitos positivos o negativos
  • NaN para resultados que no pueden ser definidos de forma razonable

# NA - datos que no existen o no han sido definidos
5 + NA
## [1] NA
# ¿Es la variable "a" NA?
a <- 5 + NA

is.na(a) # chequear si a es "NA"
## [1] TRUE
# NULL - objetos en blanco
10 + NULL
## numeric(0)
# ¿Es la variable "b" un objeto NULO?
b <- 10 + NULL

is.null(b) # chequear si expresión es NULL
## [1] FALSE
is.numeric(b) # chequear si expresión es NULL
## [1] TRUE
# Inf** / -Inf - para experesar números infinito positivos o negativos
5 / 0
## [1] Inf
# ¿Es la variable "d" un objeto finito?
d <- 5 / 0 # Chequear si la expresión es finita
is.finite(d) 
## [1] FALSE
# NaN - valores indefinidos
0 / 0
## [1] NaN
# ¿Es la variable "e" un objeto NaN?
e <- 0 / 0 # Chequear si la expresión es NaN
is.nan(e)
## [1] TRUE

Vectores

Un vector es un conjunto de valores (números, caracteres, etc.) que podemos guardar dentro de un objeto o variable. Para asignar una serie de valores a un objeto, vamos a crear una variable usando la función de concatenar - c(). Esta es una función genérica para combinar argumentos en una serie de datos única.


# Vector numérico
v1 <- c(1, 5, 11, 33)
v1
## [1]  1  5 11 33
# Vector numérico con la función "seq"
v2 <- seq(5, 50, by = 5)
v2
##  [1]  5 10 15 20 25 30 35 40 45 50
length(v2)
## [1] 10
# Vector numérico con la función "seq"
v3 <- seq(2, 2000, length = 10)
v3
##  [1]    2  224  446  668  890 1112 1334 1556 1778 2000
# Vector de caracteres simple
v4 <- c("a", "b", "c", "d")
v4
## [1] "a" "b" "c" "d"
# Vector de caracteres complejo
v5 <- c("y", "nos", "dieron", "las", "diez", "y", "las", "once")
v5
## [1] "y"      "nos"    "dieron" "las"    "diez"   "y"      "las"    "once"
# Vector de caracteres complejo usando función "rep"
v6 <- c(rep("a", 5), rep("b", 10), rep("once", 20), rep("d", 50))
v6
##  [1] "a"    "a"    "a"    "a"    "a"    "b"    "b"    "b"    "b"    "b"   
## [11] "b"    "b"    "b"    "b"    "b"    "once" "once" "once" "once" "once"
## [21] "once" "once" "once" "once" "once" "once" "once" "once" "once" "once"
## [31] "once" "once" "once" "once" "once" "d"    "d"    "d"    "d"    "d"   
## [41] "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"   
## [51] "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"   
## [61] "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"   
## [71] "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"    "d"   
## [81] "d"    "d"    "d"    "d"    "d"
# Vector de caracteres usando función "letters" o "LETTERS"
v7 <- letters[1:10]
v7
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
v8 <- LETTERS[1:20]
v8
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T"
# Combinar vectores de caracteres y números
v9 <- c(1, "b", 2, "d", 3, "z", 10, "alpha", 500, "tom", 1000)
v9
##  [1] "1"     "b"     "2"     "d"     "3"     "z"     "10"    "alpha" "500"  
## [10] "tom"   "1000"
# Combinar vectores de caracteres y números con funciones "seq" y "rep"
v10 <- c(seq(1, 355, l = 34), letters[4:15], rep(5, 10), LETTERS[15:20])
v10
##  [1] "1"                "11.7272727272727" "22.4545454545455" "33.1818181818182"
##  [5] "43.9090909090909" "54.6363636363636" "65.3636363636364" "76.0909090909091"
##  [9] "86.8181818181818" "97.5454545454545" "108.272727272727" "119"             
## [13] "129.727272727273" "140.454545454545" "151.181818181818" "161.909090909091"
## [17] "172.636363636364" "183.363636363636" "194.090909090909" "204.818181818182"
## [21] "215.545454545455" "226.272727272727" "237"              "247.727272727273"
## [25] "258.454545454545" "269.181818181818" "279.909090909091" "290.636363636364"
## [29] "301.363636363636" "312.090909090909" "322.818181818182" "333.545454545455"
## [33] "344.272727272727" "355"              "d"                "e"               
## [37] "f"                "g"                "h"                "i"               
## [41] "j"                "k"                "l"                "m"               
## [45] "n"                "o"                "5"                "5"               
## [49] "5"                "5"                "5"                "5"               
## [53] "5"                "5"                "5"                "5"               
## [57] "O"                "P"                "Q"                "R"               
## [61] "S"                "T"
length(v10)
## [1] 62
# Vector lógico
v.log <- c(TRUE, TRUE, FALSE, T, T, F, F, F, F)
v.log
## [1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE
# Combinar vectores "v1", "v2", "v3"
v.comb <- c(v1, v2, v3)
v.comb
##  [1]    1    5   11   33    5   10   15   20   25   30   35   40   45   50    2
## [16]  224  446  668  890 1112 1334 1556 1778 2000

Podemos manipular o seleccionar elementos específicos de un vector utilizando la función [ ] sobre un índice. Entender esto será muy importante posteriormente cuando tratemos de analizar y manipular bases de datos más complejas.


# Seleccionar el segundo elemento del vector numérico "v1"
v1[2]
## [1] 5
# Seleccionar el quinto elemento del vector "v2"
v2[5]
## [1] 25
# Seleccionar la letra "d" del vector "v4"
v4[4]
## [1] "d"
# Seleccionar la última palabra del vector "v5"
v5[8]
## [1] "once"
# Seleccionar el elemnto 42 vector "v10"
v10[42]
## [1] "k"

¿Qué tal si quisieramos seleccionar el último elemento del vector v10. Veremos una forma manual y otra mucho más rápida y automatizada, que utiliza la función length.
***

# Forma manual usando el índice de la posición 62:
v10[62]
## [1] "T"
# Forma automatizada usando último elemento del vector:
length(v10)
## [1] 62
# dos lineas de codigo
a <- length(v10)
v10[a]
## [1] "T"
# una linea
v10[length(v10)]
## [1] "T"
v5
## [1] "y"      "nos"    "dieron" "las"    "diez"   "y"      "las"    "once"
v5[c(5, 8)]
## [1] "diez" "once"
a <- c(5, 8)
v5[a]
## [1] "diez" "once"

La función sample nos permite “muestrear” un vector existente o un vector númerico para realizar una selección aleatoria. Por ejemplo, podemos crear un objeto o vector “v.nuevo” que contenga una secuencia de 100 números, iniciando en 1.3 y terminando en 1024, y muestrear de forma aleatoria 20 números de esa secuencia.


# Crear secuencia y depositarla en vector "v.nuevo"
v.nuevo <- seq(1.3, 1024, l = 100)

# Crear vector aleatorio con 20 elementos numéricos (replace = FALSE)
v.nuevo2a <- sample(v.nuevo, size = 20, replace = FALSE)
v.nuevo2a
##  [1] 672.7697 879.3758 404.1818 269.8879 941.3576 745.0818 962.0182 114.9333
##  [9] 714.0909 476.4939 424.8424 435.1727 848.3848 559.1364 197.5758 889.7061
## [17] 125.2636 993.0091 321.5394 311.2091
# Crear vector aleatorio con 20 elementos numéricos (replace = TRUE)
v.nuevo2b <- sample(v.nuevo, size = 20, replace = TRUE)
v.nuevo2b
##  [1]  972.3485  393.8515  672.7697  331.8697 1003.3394  187.2455  259.5576
##  [8]  993.0091  280.2182  207.9061  621.1182  538.4758  848.3848  176.9152
## [15]  703.7606  393.8515  404.1818  280.2182 1013.6697  734.7515
# Forma más directa
v.nuevoc <- sample(seq(1.3, 1024, l = 100), 20, replace = FALSE)
v.nuevoc
##  [1]   94.27273  466.16364  197.57576  176.91515  827.72424   32.29091
##  [7]  404.18182  207.90606   11.63030  590.12727 1003.33939  156.25455
## [13]  765.74242  672.76970  879.37576  145.92424  218.23636    1.30000
## [19]  104.60303  652.10909

 

Ejercicios

  1. Crear un vector v que contenga la secuencia de 1 a 6 repetida 5 veces.


  1. Crear un vector v en donde se repita cada número de la secuencia de 25-250 tres veces.


  1. Crear un vector v que contenga 10 números aleatorios que varían entre -100 y 100. La secuencia de números no se pueden repetir.


  1. Crear un vector de caracteres llamado v.car que contenga la siguiente secuencia de palabras: “a”, “la”, “mayoria”, “de”, “las”, “personas”, “no”, “les”, “gusta”, “la”, “programacion”. Una vez creado el vector v.car, seleccione las palabras “a”, “las”, “personas”, “les”, “gusta”, y lo guarda en un nuevo vector v.car2.


  1. Cree un vector v.nuevo que contenga los vectores v1, v2, v3 y v4 que fueron creados anteriormente.


  1. Utilice la función seq para crear un vector v.seq que contenga solo los elementos impares del vector v10, el cual fue creado anteriormente.


Operaciones con vectores


# Longitud de un vector
length(v5)
## [1] 8
length(v8)
## [1] 20
# Operaciones con vectores
v.1 <- 1:4
v.2 <- rep(v.1, 5)

# Operaciones con vectores
v1 + v.1
## [1]  2  7 14 37
v.1 + 5
## [1] 6 7 8 9
v.1 * 2
## [1] 2 4 6 8
# Esta expresión me da un error, ¿Por qué?
v.1 + c(1, 3, 7)
## [1]  2  5 10  5
# Suma de todos los elementos de un vector
sum(v.1)
## [1] 10
# Promedio de todos los elementos de un vector
mean(v.1)
## [1] 2.5
# Desviación estándar
sd(v.1)
## [1] 1.290994
# Correlación
cor(v.1, c(0.5, 4.2, 9.1, 10.3))
## [1] 0.9773111

Operadores lógicos


# Vector numérico
v1 <- c(2, 5, 11, 33, 4, 1050)

# Comparar cada elemento con el número 5, regresa un vector lógico
v1 > 5
## [1] FALSE FALSE  TRUE  TRUE FALSE  TRUE
# ¿Son todos los elementos correspondientes equivalente?
v2 <- c(2, 4, 12, 33, 3, 1050)
v1 == v2
## [1]  TRUE FALSE FALSE  TRUE FALSE  TRUE
# ¿No son todos los elementos correspondientes equivalentes?
v1 != v2
## [1] FALSE  TRUE  TRUE FALSE  TRUE FALSE
# Operador "OR" (regresa un vector lógico)
v.n <- (v1 > 5) | (v2 > 12)

# Operador "AND" (regresa vector lógico)
v.n2 <- (v1 > 5) & (v2 > 12)

# Doble operador "OR"; regresa un sólo valor lógico
(v1 > 5) || (v2 > 12)
## Warning in (v1 > 5) || (v2 > 12): 'length(x) = 6 > 1' in coercion to
## 'logical(1)'

## Warning in (v1 > 5) || (v2 > 12): 'length(x) = 6 > 1' in coercion to
## 'logical(1)'
## [1] FALSE
# Doble operador "AND"; regresa un sólo valor lógico 
(v1 > 5) && (v2 > 12)
## Warning in (v1 > 5) && (v2 > 12): 'length(x) = 6 > 1' in coercion to
## 'logical(1)'
## [1] FALSE
(v1 > 1) && (v2 > 1)
## Warning in (v1 > 1) && (v2 > 1): 'length(x) = 6 > 1' in coercion to 'logical(1)'
## Warning in (v1 > 1) && (v2 > 1): 'length(x) = 6 > 1' in coercion to 'logical(1)'
## [1] TRUE

Selección con operadores lógicos

A continuación, vamos a usar lo que hemos aprendido para realizar selecciones usando operadores lógicos.

Ejemplo 1, usando vectores con caracteres.


# Vectores con caracteres
v1 <- c("juan", "Carlos", "mario", "elena", "Sofia")
v2 <- c("Juan", "Carlos", "victor", "elena", "Sofya")

# Determinar elementos de v1 y v2 que sean exactamente iguales
v1[v1 == v2]
## [1] "Carlos" "elena"
v2[v1 == v2]
## [1] "Carlos" "elena"
# Otra forma de resolver 
a <- v1 == v2
v1[a]
## [1] "Carlos" "elena"

Ejemplo 2, usando vectores numéricos.


# Vectores numéricos
v1 <- c(22.3, 24, 21, 16, 28.6, 26.0, 23.3, 30.9, 28.7, 20.0, 23.4)
v2 <- sample(seq(16, 32, 0.4), 11)

# Identificar valores de ambos vectores que sean menores a 22
v1 < 22
##  [1] FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
v2 < 22
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE
# Seleccionar los valores de ambos vectores que cumplan la condición anterior
v1[v1 < 22]
## [1] 21 16 20
v2[v2 < 22]
## [1] 16.0 20.4 20.8 16.8 18.4

Ejemplo 3, usando vectores lógicos.


# Vectores numéricos
v1 <- c("TRUE", "TRUE", "FALSE", "TRUE", "FALSE", "FALSE", "FALSE")
v2 <- c("TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "FALSE")

# Seleccionar elementos que sean verdaderos o "TRUE
v1[v1 == TRUE]
## [1] "TRUE" "TRUE" "TRUE"
v2[v2 == TRUE]
## [1] "TRUE" "TRUE" "TRUE" "TRUE"

 

Ejercicios

  1. Crear dos vectores, uno que represente el peso de un grupo de 10 hombres y otro que represente el peso de un grupo de 10 mujeres. Una vez que tengamos ambos vectores, vamos a determinar la diferencia entre el peso promedio de los hombres y las mujeres. Utilice las funciones sample y seq para crear los vectores de 10 valores de los pesos para hombres y mujeres. Los pesos de hombres pueden oscilar entre 60-95 kg y los pesos de mujeres entre 50-80 kg. Nota: Los valores de cada vector no pueden repetirse.


  1. A partir de los vectores creados en el ejercicio anterior, seleccione: (i) los pesos de hombres que sean mayores a 75 kg, y (ii) los pesos de mujeres que sean menores a 75 kg. Guarde ambos resultados en un objeto llamado “v.sel1” y v.sel2”, respectivamente.


Factores

Los factores se usan para almacenar datos categóricos. Por ejemplo, el color de los ojos, las provincias o estados de un país, las especies de mamíferos, etc.


# Vector
col.ojo1 <- c("café", "verde", "café", "azul", "azul", "verde")

# Factor
col.ojo2 <- factor(c("café", "verde", "café", "azul", "azul", "verde"))

# Niveles del factor
levels(col.ojo1)
## NULL
levels(col.ojo2)
## [1] "azul"  "café"  "verde"
# Longitud de los niveles del factor
length(levels(col.ojo2))
## [1] 3
# Transformar factor a vector numérico
as.numeric(col.ojo1) 
## Warning: NAs introduced by coercion
## [1] NA NA NA NA NA NA
as.numeric(col.ojo2) 
## [1] 2 3 2 1 1 3
# Transformar factor a verctor de caracteres
as.character(col.ojo1) 
## [1] "café"  "verde" "café"  "azul"  "azul"  "verde"
as.character(col.ojo2) 
## [1] "café"  "verde" "café"  "azul"  "azul"  "verde"

Manipulación de datos: I parte

Una de las mejores herramientas y utilidades que tiene R es poder accesar y manipular grandes bases de datos. Sin embargo, la manipulación de bases de datos puede resultar un poco compleja al inicio. Realizar operaciones sencillas requiere de práctica. Muchas personas se frustran mucho al inicio, ya que, para aprender este lenguaje, y sobre todo para ser muy fluido se debe practicar constantemente, y eso toma tiempo. Lo que hacíamos antes en programas como Excel se complica un poco cuando cambiamos a R. Pocas veces vemos el gran valor que tiene R al inicio, y continuamos nuestra dependencia de otros programas estadísticos y de graficación que nos resultan más amigables. Sin embargo, una vez que tenemos una buena base y fluidez, nos damos cuenta que en realidad hacer las cosas en R es más rápido y sencillo. Este tipo de lenguajes de programación nos obligan a razonar mejor y resolver problemas más complejos.

Esta sección pretende darnos herramientas importantes para poder manipular elementos en R. Por ejemplo, volviendo a nuestro pequeño set de datos de los pesos del grupo de hombres y mujeres, si yo quisiera comparar el peso específico de algunos hombres y mujeres del grupo, debo realizar operaciones que me permitan extraer ciertos valores.


# Vector de pesos
hombres <- sample(60:100, size = 10, replace = FALSE)
mujeres <- sample(40:80, size = 10, replace = FALSE)

# Seleccionar el segundo valor de peso de los hombres
hombres.sel <- hombres[2]

# Seleccionar quinto valor de peso de las mujeres
mujeres.sel <- mujeres[5]

# Diferencia (absoluta) entre las tallas de individuos seleccionados
peso.sel.dif <- abs(hombres.sel - mujeres.sel)
peso.sel.dif
## [1] 6

Matrices

Una matriz es un vector que tiene dos dimensiones. El tamaño de una matriz esta definida por el número de filas y columnas que posee.


# Crear una matriz de 5 columnas y 4 filas, con solo valores de 1s
m <- matrix(data = 1, nrow = 5, ncol = 4) 
m <- matrix(1, 5, 4)

# Dimensiones
dim(m)        
## [1] 5 4
# Crear una matriz al combinar vectores
c1 <- seq(1, 5, 1)
c2 <- 5:1
c3 <- 5:9

m1 <- cbind(c1, c2, c3)
m2 <- rbind(1:5, 5:1, 5:9)

Seleccionar elementos de una matriz.


# Crear una matriz
m <- matrix(seq(from = 1, to = 35, l = 100), 10, 10)

# Seleccionar elemento de la fila 2, columna 3 de la matriz
m[2, 3]
## [1] 8.212121
# Seleccionar todos los elementos de la segunda fila
m[2, ]
##  [1]  1.343434  4.777778  8.212121 11.646465 15.080808 18.515152 21.949495
##  [8] 25.383838 28.818182 32.252525
# Seleccionar todos los elementos de la segunda columna
m[ ,2]
##  [1] 4.434343 4.777778 5.121212 5.464646 5.808081 6.151515 6.494949 6.838384
##  [9] 7.181818 7.525253
# Crear submatriz: filas 1 y 2; columnas 4, 5 y 6
sel <- m[c(1,2), c(4, 5, 6)]
sel <- m[1:2, 4:6]

# Seleccionar todas las filas de la matriz "m" excepto la 1
m1 <- m[-1,]

# Seleccionar todas las columnas excepto la 3, 5, 6, 7 y 9
m2 <- m[, -c(3, 5:7, 9)]

Otros operadores


# Crear una matriz
m <- matrix(5, 5, 5)

names(m)
## NULL
colnames(m) <- c("A", "B", "C", "D", "E")
colnames(m)
## [1] "A" "B" "C" "D" "E"
names(m)
## NULL
rownames(m) <- c("A", "B", "C", "D", "E")
m
##   A B C D E
## A 5 5 5 5 5
## B 5 5 5 5 5
## C 5 5 5 5 5
## D 5 5 5 5 5
## E 5 5 5 5 5
rownames(m)
## [1] "A" "B" "C" "D" "E"
str(m)
##  num [1:5, 1:5] 5 5 5 5 5 5 5 5 5 5 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:5] "A" "B" "C" "D" ...
##   ..$ : chr [1:5] "A" "B" "C" "D" ...
# ¿Son todos los elementos en la fila 1 equivalentes a elementos de columna 1?
m[1, ] == m[, 1] 
##    A    B    C    D    E 
## TRUE TRUE TRUE TRUE TRUE
# Matriz lógica, "TRUE" para elementos de "m" mayores a 15.
m1 <- m > 15 

# Frecuencia de verdaderos y falsos de acuerdo a selección lógica
table(m > 15)
## 
## FALSE 
##    25
sum (m > 15)
## [1] 0
sum (!m > 15)
## [1] 25
which(m > 15)
## integer(0)
# Seleccionar solo elementos verdaderos, mayores a 15
m2 <- m[m > 15]

# Transponer matriz "m"
m3 <- t(m)

data.frame

Es una especie de lista que se utiliza para almacenar bases de datos. Piensen en filas como observaciones y columnas como variables. Cada columna es un vector o factor.


# Crear dataframe
df <- data.frame(ID = 1:8, 
                 Nombre = c("Jorge", "Marta", "Isaac", "Tati",
                          "Luis", "Esteban", "Maria", "Laura"),
                 Mujer = c(FALSE, TRUE, FALSE, TRUE,
                            F, F, T, T), 
                 Edad = c(28, 27, 44, 55, 23, 32, 16, 36),
                 Provincia = c(rep("San Jose", 3), rep("Guanacaste", 4), "Limon"),
                 stringsAsFactors = FALSE)

# Resumir o visualizar base de datos
head(df) # visualizar primeras 6 filas
##   ID  Nombre Mujer Edad  Provincia
## 1  1   Jorge FALSE   28   San Jose
## 2  2   Marta  TRUE   27   San Jose
## 3  3   Isaac FALSE   44   San Jose
## 4  4    Tati  TRUE   55 Guanacaste
## 5  5    Luis FALSE   23 Guanacaste
## 6  6 Esteban FALSE   32 Guanacaste
tail(df) # visualizar últimas 6 filas
##   ID  Nombre Mujer Edad  Provincia
## 3  3   Isaac FALSE   44   San Jose
## 4  4    Tati  TRUE   55 Guanacaste
## 5  5    Luis FALSE   23 Guanacaste
## 6  6 Esteban FALSE   32 Guanacaste
## 7  7   Maria  TRUE   16 Guanacaste
## 8  8   Laura  TRUE   36      Limon
str(df) # chequear la estructura
## 'data.frame':    8 obs. of  5 variables:
##  $ ID       : int  1 2 3 4 5 6 7 8
##  $ Nombre   : chr  "Jorge" "Marta" "Isaac" "Tati" ...
##  $ Mujer    : logi  FALSE TRUE FALSE TRUE FALSE FALSE ...
##  $ Edad     : num  28 27 44 55 23 32 16 36
##  $ Provincia: chr  "San Jose" "San Jose" "San Jose" "Guanacaste" ...
summary(df) # resumen de variables
##        ID          Nombre            Mujer              Edad      
##  Min.   :1.00   Length:8           Mode :logical   Min.   :16.00  
##  1st Qu.:2.75   Class :character   FALSE:4         1st Qu.:26.00  
##  Median :4.50   Mode  :character   TRUE :4         Median :30.00  
##  Mean   :4.50                                      Mean   :32.62  
##  3rd Qu.:6.25                                      3rd Qu.:38.00  
##  Max.   :8.00                                      Max.   :55.00  
##   Provincia        
##  Length:8          
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
df
##   ID  Nombre Mujer Edad  Provincia
## 1  1   Jorge FALSE   28   San Jose
## 2  2   Marta  TRUE   27   San Jose
## 3  3   Isaac FALSE   44   San Jose
## 4  4    Tati  TRUE   55 Guanacaste
## 5  5    Luis FALSE   23 Guanacaste
## 6  6 Esteban FALSE   32 Guanacaste
## 7  7   Maria  TRUE   16 Guanacaste
## 8  8   Laura  TRUE   36      Limon
sd(df$Edad)
## [1] 12.3281
edad <- df[ , 4]
sd(edad)
## [1] 12.3281
sd(df[, 4])
## [1] 12.3281
# Nombres de las variables o columnas de un data.frame
names(df)
## [1] "ID"        "Nombre"    "Mujer"     "Edad"      "Provincia"
colnames(df)
## [1] "ID"        "Nombre"    "Mujer"     "Edad"      "Provincia"
rownames(df) <- letters[1:8]

# Seleccionar la segunda columna de "df"
df$Nombre
## [1] "Jorge"   "Marta"   "Isaac"   "Tati"    "Luis"    "Esteban" "Maria"  
## [8] "Laura"
df[ , 2]
## [1] "Jorge"   "Marta"   "Isaac"   "Tati"    "Luis"    "Esteban" "Maria"  
## [8] "Laura"

Alternativamente, podemos usar la opción stringsAsFactors = FALSE para que los caracteres no sean considerados como factores


# Especificar que texto no es un factor, sino un caracter 
df2 <- data.frame(ID = 1:8,
                 Nombre = c("Jorge", "Marta", "Isaac", "Tati",
                          "Luis", "Esteban", "Maria", "Laura"),
                 Mujer = c(FALSE, TRUE, FALSE, TRUE,
                            F, F, T, T), 
                 Edad = c(28, 27, 44, 55, 23, 32, 16, 36),
                 Provincia = c(rep("San Jose", 3), rep("Guanacaste", 4), "Limon"),
                 stringsAsFactors = FALSE)

str(df2)
## 'data.frame':    8 obs. of  5 variables:
##  $ ID       : int  1 2 3 4 5 6 7 8
##  $ Nombre   : chr  "Jorge" "Marta" "Isaac" "Tati" ...
##  $ Mujer    : logi  FALSE TRUE FALSE TRUE FALSE FALSE ...
##  $ Edad     : num  28 27 44 55 23 32 16 36
##  $ Provincia: chr  "San Jose" "San Jose" "San Jose" "Guanacaste" ...
# Escoger columna "Name"
df2$Nombre   
## [1] "Jorge"   "Marta"   "Isaac"   "Tati"    "Luis"    "Esteban" "Maria"  
## [8] "Laura"

Si queremos cambiar el nombre de las variables en nuestra base de datos, debemos usar la función names y proporcionar la lista de los nombres de las nuevas variables.


# Crear dataframe
df <- data.frame(ID = 1:8,
                 Nombre = c("Jorge", "Marta", "Isaac", "Tati",
                          "Luis", "Esteban", "Maria", "Laura"),
                 Mujer = c(FALSE, TRUE, FALSE, TRUE,
                            F, F, T, T), 
                 Edad = c(28, 27, 44, 55, 23, 32, 16, 36),
                 Provincia = c(rep("San Jose", 3), 
                               rep("Guanacaste", 4), "Limon"))

# Cambiar nombres de las variables o columnas de un data.frame
names(df) <- c("id", "nombre", "mujer", "edad", "provincia")
names(df)[2] <- "estudiante"
colnames(df)
## [1] "id"         "estudiante" "mujer"      "edad"       "provincia"
age <- df$Edad

names(df)[4] <- "years"

names(df)[c(2, 5)] <- c("names", "states")

Accesar elementos del data.frame


# Crear dataframe
df <- data.frame(ID = 1:8,
                 Nombre = c("Jorge", "Marta", "Isaac", "Tati",
                          "Luis", "Esteban", "Maria", "Laura"),
                 Mujer = c(FALSE, TRUE, FALSE, TRUE,
                            F, F, T, T), 
                 Edad = c(28, 27, 44, 55, 23, 32, 16, 36),
                 Provincia = c(rep("San Jose", 3), rep("Guanacaste", 4), "Limon"))

# Seleccionar toda la primera fila
df[1, ]
##   ID Nombre Mujer Edad Provincia
## 1  1  Jorge FALSE   28  San Jose
# Seleccionar toda la primera columna
df[ , 1]
## [1] 1 2 3 4 5 6 7 8
# Seleccionar la columna de edad
df$Edad
## [1] 28 27 44 55 23 32 16 36
# Seleccionar filas 1 y 2, columnas 3 y 4
df[1:2, 3:4]
##   Mujer Edad
## 1 FALSE   28
## 2  TRUE   27
df[c(1, 2), c(3, 4)]
##   Mujer Edad
## 1 FALSE   28
## 2  TRUE   27
# Seleccionar filas de la 1-5, columnas 3 y 4
df[c(1:5), c(3, 4)]
##   Mujer Edad
## 1 FALSE   28
## 2  TRUE   27
## 3 FALSE   44
## 4  TRUE   55
## 5 FALSE   23
# Seleccionar filas 1 y 3, todas las columnas
df[c(1, 3), ]
##   ID Nombre Mujer Edad Provincia
## 1  1  Jorge FALSE   28  San Jose
## 3  3  Isaac FALSE   44  San Jose
# Seleccionar a todas las personas que tengan más de 30 años
df[df$Edad > 30, ]
##   ID  Nombre Mujer Edad  Provincia
## 3  3   Isaac FALSE   44   San Jose
## 4  4    Tati  TRUE   55 Guanacaste
## 6  6 Esteban FALSE   32 Guanacaste
## 8  8   Laura  TRUE   36      Limon
df[df$Edad > 30, c(2, 4:5)]
##    Nombre Edad  Provincia
## 3   Isaac   44   San Jose
## 4    Tati   55 Guanacaste
## 6 Esteban   32 Guanacaste
## 8   Laura   36      Limon
# Encontrar la edad promedio de las mujeres
a <- df[df$Mujer == TRUE, ]
edad <- a$Edad
edad <- a[, 4]

mean(edad)
## [1] 33.5
mean(df[df$Mujer == TRUE, 4])
## [1] 33.5
# Promedio de edad para provincia Guanacaste
mean(df[df$Provincia == "Guanacaste", 4])
## [1] 31.5
df
##   ID  Nombre Mujer Edad  Provincia
## 1  1   Jorge FALSE   28   San Jose
## 2  2   Marta  TRUE   27   San Jose
## 3  3   Isaac FALSE   44   San Jose
## 4  4    Tati  TRUE   55 Guanacaste
## 5  5    Luis FALSE   23 Guanacaste
## 6  6 Esteban FALSE   32 Guanacaste
## 7  7   Maria  TRUE   16 Guanacaste
## 8  8   Laura  TRUE   36      Limon
# Promedio de edad para San Jose y Limon

a <- df[c(df$Provincia == "San Jose", df$Provincia == "Limon"), ]

#df[df$Provincia == c("San Jose", "Limon"), ]

df[df$Provincia %in% c("San Jose", "Limon"), ]
##   ID Nombre Mujer Edad Provincia
## 1  1  Jorge FALSE   28  San Jose
## 2  2  Marta  TRUE   27  San Jose
## 3  3  Isaac FALSE   44  San Jose
## 8  8  Laura  TRUE   36     Limon
mean(df[df$Provincia %in% c("San Jose", "Limon"), 4])
## [1] 33.75
mean(df[df$Provincia == "San Jose" | df$Provincia == "Limon", 4])
## [1] 33.75
df[, 2]
## [1] "Jorge"   "Marta"   "Isaac"   "Tati"    "Luis"    "Esteban" "Maria"  
## [8] "Laura"

Data Frame vs. Matrix

Las bases de datos tipo data.frame y matrix tienen propiedades distintas. En una matrix solo podemos tener valores numéricos o caracteres, mientras que en un data.frame podemos combinar ambos. Esto facilita la selección de valores en un data.frame. Por ejemplo, si quisiéramos escoger una única variable en nuestra data.frame podemos usar el símbolo $. Sin embargo, a pesar de estás diferencias, muchas de las formas de manipulación de datos son similares.

Para saber si nuestra base de datos/variable es una matriz o una data.frame podemos usar la función str. Esta función proporciona información de la estructura de una variable. Por ejemplo, cuantos datos/observaciones existen, cuantas columnas/filas tiene la base de datos (o las dimensiones), el nombre de las columnas/filas, el tipo de variable que son (numéricas, de caracteres, factores, etc).

La función names no funciona en bases de datos tipo matrix. Para matriz debemos usar la función colnames. A continuación, vamos a cambiar el nombre de las columnas en nuestra data frame y matriz de pesos de hombres y mujeres.


# Vector de pesos
hombres <- sample(60:100, size = 10, replace = FALSE)
mujeres <- sample(40:80, size = 10, replace = FALSE)

# Crear data.frame
db <- data.frame(hombres, mujeres)
db
##    hombres mujeres
## 1       85      44
## 2       87      64
## 3       63      51
## 4       78      40
## 5       80      63
## 6       77      67
## 7       94      61
## 8       95      42
## 9       69      66
## 10      81      55
str(db)
## 'data.frame':    10 obs. of  2 variables:
##  $ hombres: int  85 87 63 78 80 77 94 95 69 81
##  $ mujeres: int  44 64 51 40 63 67 61 42 66 55
# Crear matriz
db2 <- cbind(hombres, mujeres)
db2
##       hombres mujeres
##  [1,]      85      44
##  [2,]      87      64
##  [3,]      63      51
##  [4,]      78      40
##  [5,]      80      63
##  [6,]      77      67
##  [7,]      94      61
##  [8,]      95      42
##  [9,]      69      66
## [10,]      81      55
str(db2)
##  int [1:10, 1:2] 85 87 63 78 80 77 94 95 69 81 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : NULL
##   ..$ : chr [1:2] "hombres" "mujeres"
# Inspeccionar si bases de datos son "data.frame" o "matrix"
is.data.frame((db))
## [1] TRUE
is.matrix(db)
## [1] FALSE
is.data.frame(db2)
## [1] FALSE
is.matrix(db2)
## [1] TRUE
# Cambiar nombre de variables en data.frame
names(db) <- c("H", "M")
names(db)
## [1] "H" "M"
# Cambiar nombre de variables en matriz
names(db2)
## NULL
colnames(db2)
## [1] "hombres" "mujeres"
colnames(db2) <- c("H", "M")

Ya hemos generado variables por separado y agrupado esas variables en una sola base de datos (data.frame o matrix). También sabemos cómo inspeccionar la estructura de las bases de datos y preguntarle a R si eso que vemos es un data.frame o una matrix. Ahora es tiempo de ampliar nuestras habilidades en la manipulación de datos.

A continuación usaremos nuestra base de datos (“df”), la cual contenía información de varios estudiantes para responder algunos preguntas.


 

Ejercicios


  1. Usando el data.frame “df” que habiamos creado anteriormente, seleccione solo la columna con la información de provincia.


  1. Seleccione la provincia que esta en la cuarta fila


  1. Seleccione toda la información de Marta, Tati y Esteban


  1. Seleccione los estudiantes que tienen más de 30 años


  1. Seleccione los hombres que tienen más de 30 años


  1. Seleccione el nombre de los estudiantes (hombres) que tienen más de 30 años y guardar la selección en un objeto de caracteres


Ejemplo guiado

Ahora vamos a dar un paso más en complejidad que nos va ayudar también a mejorar nuestras habilidades para manipular datos. Vamos a generar una base de datos más compleja, y la vez aprenderemos algunas funciones básicas, pero mucha utilidad.

Pensemos en una base de datos en donde las variables no están en columnas sino en filas. De hecho, para muchos análisis estadísticos es necesario tener las variables agrupadas y no en modo “expandido”, como lo acabamos de ver en nuestro ejemplo pequeño con tiburones.

A continuación, vamos a generar un set de datos ficticio en el que se evalua el efecto de la concentración de un contaminante (mercurio Hg) en peces (machos y hembras) de 3 regiones de Costa Rica (Pacífico Norte, Pacífico Central y Pacífico Sur). Los niveles del Hg fueron determinados en una muestra aleatoria de peces recolectados en las 3 regiones (mg Hg / 100 ml de sangre).

La función runif puede ser usada para generar una lista de valores aleatorios que representen los niveles de calcio en los pacientes. Entre los parámetros de esta función están n, min y max, que representan el número de observaciones, el valor mínimo y el valor máximo, respectivamente.


# Generar lista de valores aleatorios que representen niveles de Hg
Hg <- rep(runif(n = 27, min = 15, max = 28), times = 3)

# Nombre de los sitios de muestreo
region <- rep(c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
              times = 1000)

# Estadios de madurez sexual
sexo <- rep(c("macho", "hembra"), times = 1000)

# Chequear estructura
str(Hg)
##  num [1:81] 20 24 27.7 17.9 23.1 ...
str(region)
##  chr [1:3000] "Pacifico Norte" "Pacifico Central" "Pacifico Sur" ...
str(sexo)
##  chr [1:2000] "macho" "hembra" "macho" "hembra" "macho" "hembra" "macho" ...
# Transformar  variables a factores
region <- as.factor(region)
sexo <- as.factor(sexo)

levels(region)
## [1] "Pacifico Central" "Pacifico Norte"   "Pacifico Sur"
levels(sexo)
## [1] "hembra" "macho"
# Estructura de variables transformadas
str(region)
##  Factor w/ 3 levels "Pacifico Central",..: 2 1 3 2 1 3 2 1 3 2 ...
str(sexo)
##  Factor w/ 2 levels "hembra","macho": 2 1 2 1 2 1 2 1 2 1 ...
# Ordenar niveles del factor
levels(region)
## [1] "Pacifico Central" "Pacifico Norte"   "Pacifico Sur"
region <- factor(region, 
                 levels = c("Pacifico Norte", 
                            "Pacifico Central", "Pacifico Sur"))

region
##    [1] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##    [5] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##    [9] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [13] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [17] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [21] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [25] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [29] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [33] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [37] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [41] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [45] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [49] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [53] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [57] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [61] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [65] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [69] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [73] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [77] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [81] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [85] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##   [89] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##   [93] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##   [97] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [101] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [105] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [109] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [113] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [117] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [121] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [125] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [129] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [133] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [137] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [141] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [145] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [149] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [153] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [157] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [161] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [165] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [169] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [173] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [177] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [181] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [185] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [189] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [193] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [197] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [201] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [205] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [209] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [213] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [217] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [221] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [225] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [229] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [233] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [237] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [241] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [245] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [249] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [253] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [257] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [261] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [265] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [269] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [273] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [277] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [281] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [285] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [289] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [293] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [297] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [301] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [305] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [309] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [313] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [317] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [321] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [325] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [329] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [333] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [337] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [341] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [345] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [349] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [353] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [357] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [361] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [365] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [369] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [373] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [377] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [381] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [385] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [389] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [393] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [397] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [401] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [405] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [409] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [413] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [417] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [421] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [425] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [429] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [433] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [437] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [441] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [445] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [449] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [453] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [457] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [461] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [465] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [469] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [473] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [477] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [481] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [485] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [489] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [493] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [497] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [501] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [505] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [509] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [513] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [517] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [521] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [525] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [529] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [533] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [537] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [541] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [545] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [549] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [553] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [557] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [561] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [565] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [569] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [573] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [577] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [581] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [585] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [589] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [593] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [597] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [601] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [605] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [609] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [613] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [617] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [621] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [625] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [629] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [633] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [637] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [641] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [645] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [649] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [653] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [657] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [661] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [665] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [669] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [673] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [677] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [681] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [685] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [689] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [693] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [697] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [701] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [705] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [709] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [713] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [717] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [721] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [725] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [729] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [733] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [737] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [741] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [745] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [749] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [753] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [757] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [761] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [765] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [769] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [773] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [777] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [781] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [785] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [789] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [793] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [797] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [801] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [805] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [809] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [813] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [817] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [821] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [825] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [829] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [833] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [837] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [841] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [845] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [849] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [853] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [857] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [861] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [865] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [869] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [873] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [877] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [881] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [885] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [889] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [893] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [897] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [901] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [905] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [909] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [913] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [917] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [921] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [925] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [929] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [933] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [937] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [941] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [945] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [949] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [953] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [957] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [961] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [965] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [969] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [973] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [977] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [981] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [985] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
##  [989] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
##  [993] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
##  [997] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1001] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1005] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1009] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1013] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1017] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1021] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1025] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1029] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1033] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1037] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1041] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1045] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1049] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1053] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1057] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1061] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1065] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1069] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1073] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1077] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1081] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1085] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1089] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1093] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1097] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1101] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1105] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1109] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1113] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1117] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1121] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1125] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1129] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1133] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1137] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1141] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1145] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1149] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1153] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1157] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1161] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1165] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1169] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1173] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1177] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1181] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1185] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1189] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1193] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1197] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1201] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1205] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1209] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1213] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1217] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1221] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1225] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1229] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1233] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1237] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1241] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1245] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1249] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1253] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1257] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1261] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1265] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1269] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1273] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1277] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1281] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1285] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1289] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1293] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1297] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1301] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1305] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1309] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1313] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1317] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1321] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1325] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1329] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1333] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1337] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1341] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1345] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1349] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1353] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1357] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1361] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1365] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1369] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1373] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1377] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1381] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1385] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1389] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1393] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1397] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1401] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1405] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1409] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1413] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1417] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1421] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1425] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1429] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1433] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1437] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1441] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1445] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1449] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1453] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1457] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1461] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1465] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1469] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1473] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1477] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1481] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1485] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1489] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1493] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1497] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1501] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1505] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1509] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1513] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1517] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1521] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1525] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1529] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1533] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1537] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1541] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1545] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1549] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1553] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1557] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1561] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1565] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1569] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1573] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1577] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1581] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1585] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1589] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1593] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1597] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1601] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1605] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1609] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1613] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1617] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1621] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1625] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1629] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1633] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1637] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1641] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1645] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1649] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1653] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1657] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1661] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1665] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1669] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1673] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1677] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1681] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1685] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1689] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1693] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1697] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1701] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1705] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1709] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1713] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1717] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1721] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1725] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1729] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1733] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1737] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1741] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1745] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1749] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1753] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1757] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1761] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1765] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1769] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1773] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1777] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1781] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1785] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1789] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1793] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1797] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1801] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1805] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1809] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1813] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1817] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1821] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1825] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1829] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1833] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1837] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1841] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1845] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1849] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1853] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1857] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1861] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1865] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1869] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1873] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1877] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1881] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1885] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1889] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1893] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1897] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1901] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1905] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1909] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1913] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1917] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1921] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1925] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1929] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1933] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1937] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1941] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1945] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1949] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1953] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1957] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1961] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1965] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1969] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1973] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1977] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1981] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1985] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [1989] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [1993] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [1997] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2001] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2005] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2009] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2013] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2017] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2021] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2025] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2029] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2033] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2037] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2041] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2045] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2049] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2053] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2057] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2061] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2065] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2069] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2073] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2077] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2081] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2085] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2089] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2093] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2097] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2101] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2105] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2109] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2113] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2117] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2121] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2125] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2129] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2133] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2137] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2141] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2145] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2149] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2153] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2157] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2161] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2165] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2169] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2173] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2177] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2181] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2185] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2189] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2193] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2197] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2201] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2205] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2209] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2213] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2217] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2221] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2225] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2229] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2233] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2237] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2241] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2245] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2249] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2253] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2257] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2261] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2265] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2269] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2273] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2277] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2281] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2285] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2289] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2293] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2297] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2301] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2305] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2309] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2313] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2317] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2321] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2325] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2329] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2333] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2337] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2341] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2345] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2349] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2353] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2357] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2361] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2365] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2369] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2373] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2377] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2381] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2385] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2389] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2393] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2397] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2401] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2405] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2409] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2413] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2417] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2421] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2425] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2429] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2433] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2437] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2441] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2445] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2449] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2453] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2457] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2461] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2465] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2469] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2473] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2477] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2481] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2485] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2489] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2493] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2497] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2501] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2505] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2509] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2513] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2517] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2521] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2525] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2529] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2533] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2537] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2541] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2545] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2549] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2553] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2557] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2561] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2565] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2569] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2573] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2577] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2581] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2585] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2589] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2593] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2597] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2601] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2605] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2609] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2613] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2617] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2621] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2625] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2629] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2633] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2637] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2641] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2645] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2649] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2653] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2657] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2661] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2665] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2669] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2673] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2677] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2681] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2685] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2689] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2693] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2697] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2701] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2705] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2709] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2713] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2717] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2721] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2725] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2729] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2733] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2737] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2741] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2745] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2749] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2753] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2757] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2761] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2765] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2769] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2773] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2777] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2781] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2785] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2789] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2793] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2797] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2801] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2805] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2809] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2813] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2817] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2821] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2825] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2829] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2833] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2837] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2841] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2845] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2849] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2853] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2857] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2861] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2865] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2869] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2873] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2877] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2881] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2885] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2889] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2893] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2897] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2901] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2905] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2909] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2913] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2917] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2921] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2925] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2929] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2933] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2937] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2941] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2945] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2949] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2953] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2957] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2961] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2965] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2969] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2973] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2977] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2981] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2985] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## [2989] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Norte  
## [2993] Pacifico Central Pacifico Sur     Pacifico Norte   Pacifico Central
## [2997] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Sur    
## Levels: Pacifico Norte Pacifico Central Pacifico Sur
levels(region)
## [1] "Pacifico Norte"   "Pacifico Central" "Pacifico Sur"
# Niveles de factor estadios
sexo <- factor(sexo, levels = c("macho", "hembra"))

levels(region)
## [1] "Pacifico Norte"   "Pacifico Central" "Pacifico Sur"
levels(sexo)
## [1] "macho"  "hembra"
# Crear data frame
db <- data.frame(region = sample(region, 81), 
                 sexo = sample(sexo, 81), 
                 Hg)

# Visualizar primeras 6 filas de base de datos
head(db, 5)
##             region   sexo       Hg
## 1   Pacifico Norte hembra 20.03503
## 2 Pacifico Central  macho 24.04027
## 3     Pacifico Sur hembra 27.72252
## 4 Pacifico Central hembra 17.94083
## 5   Pacifico Norte hembra 23.09680
tail(db)
##              region   sexo       Hg
## 76     Pacifico Sur  macho 15.08134
## 77 Pacifico Central  macho 23.26266
## 78   Pacifico Norte  macho 21.03153
## 79   Pacifico Norte  macho 25.38643
## 80 Pacifico Central hembra 21.72903
## 81 Pacifico Central hembra 16.30551
summary(db)
##               region       sexo          Hg       
##  Pacifico Norte  :27   macho :29   Min.   :15.08  
##  Pacifico Central:27   hembra:52   1st Qu.:19.87  
##  Pacifico Sur    :27               Median :21.88  
##                                    Mean   :21.98  
##                                    3rd Qu.:25.39  
##                                    Max.   :27.72
# Dimensiones de base de datos
dim(db)
## [1] 81  3
# Estructura de base de datos
str(db)
## 'data.frame':    81 obs. of  3 variables:
##  $ region: Factor w/ 3 levels "Pacifico Norte",..: 1 2 3 2 1 1 1 2 3 1 ...
##  $ sexo  : Factor w/ 2 levels "macho","hembra": 2 1 2 2 2 1 2 1 2 1 ...
##  $ Hg    : num  20 24 27.7 17.9 23.1 ...
head(db)
##             region   sexo       Hg
## 1   Pacifico Norte hembra 20.03503
## 2 Pacifico Central  macho 24.04027
## 3     Pacifico Sur hembra 27.72252
## 4 Pacifico Central hembra 17.94083
## 5   Pacifico Norte hembra 23.09680
## 6   Pacifico Norte  macho 26.37150
db$region
##  [1] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Central
##  [5] Pacifico Norte   Pacifico Norte   Pacifico Norte   Pacifico Central
##  [9] Pacifico Sur     Pacifico Norte   Pacifico Norte   Pacifico Central
## [13] Pacifico Norte   Pacifico Norte   Pacifico Central Pacifico Central
## [17] Pacifico Sur     Pacifico Central Pacifico Norte   Pacifico Sur    
## [21] Pacifico Central Pacifico Sur     Pacifico Sur     Pacifico Sur    
## [25] Pacifico Sur     Pacifico Central Pacifico Sur     Pacifico Central
## [29] Pacifico Sur     Pacifico Sur     Pacifico Norte   Pacifico Sur    
## [33] Pacifico Norte   Pacifico Central Pacifico Central Pacifico Central
## [37] Pacifico Sur     Pacifico Central Pacifico Sur     Pacifico Norte  
## [41] Pacifico Sur     Pacifico Sur     Pacifico Central Pacifico Norte  
## [45] Pacifico Central Pacifico Norte   Pacifico Norte   Pacifico Sur    
## [49] Pacifico Sur     Pacifico Central Pacifico Norte   Pacifico Sur    
## [53] Pacifico Central Pacifico Norte   Pacifico Sur     Pacifico Central
## [57] Pacifico Sur     Pacifico Sur     Pacifico Sur     Pacifico Norte  
## [61] Pacifico Central Pacifico Central Pacifico Norte   Pacifico Norte  
## [65] Pacifico Central Pacifico Norte   Pacifico Norte   Pacifico Sur    
## [69] Pacifico Sur     Pacifico Norte   Pacifico Central Pacifico Central
## [73] Pacifico Sur     Pacifico Norte   Pacifico Norte   Pacifico Sur    
## [77] Pacifico Central Pacifico Norte   Pacifico Norte   Pacifico Central
## [81] Pacifico Central
## Levels: Pacifico Norte Pacifico Central Pacifico Sur
levels(db$region) <- c("PN", "PC", "PS")
levels(db$sexo) <- c("M", "H")

db$Hg2 <- db$Hg * 0.5

db$reg.sex <- paste(db$region, "-", db$sexo, sep = "")

db$reg.sex2 <- as.factor(paste(db$region, "-", db$sexo, ".", round(db$Hg, 0), sep = ""))

str(db)
## 'data.frame':    81 obs. of  6 variables:
##  $ region  : Factor w/ 3 levels "PN","PC","PS": 1 2 3 2 1 1 1 2 3 1 ...
##  $ sexo    : Factor w/ 2 levels "M","H": 2 1 2 2 2 1 2 1 2 1 ...
##  $ Hg      : num  20 24 27.7 17.9 23.1 ...
##  $ Hg2     : num  10.02 12.02 13.86 8.97 11.55 ...
##  $ reg.sex : chr  "PN-H" "PC-M" "PS-H" "PC-H" ...
##  $ reg.sex2: Factor w/ 47 levels "PC-H.16","PC-H.18",..: 15 12 39 2 18 28 21 9 38 23 ...
db2 <- db[, 1:3]

db3 <- db[, -c(1, 5)]
db4 <- db[-(1:60), -c(1, 5)]

Cuando empezamos a trabajar con bases de datos más grandes es importante encontrar formas para resumir, extraer, visualizar y analizar ciertas relaciones. Además, es importante mantener el orden, ya que eso nos ayudará a entender mejor lo que estamos haciendo.

Podemos usar la función order para ordenar nuestra base de datos de acuerdo a una o varias de las variables que tenemos. Por ejemplo,


# Generar lista de valores aleatorios que representen niveles de calcio
Hg <- rep(runif(n = 27, min = 15, max = 28), times = 3)

# Nombre de los sitios de muestreo
region <- factor(rep(c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
              times = 1000), levels = c("Pacifico Norte", 
                            "Pacifico Central", "Pacifico Sur"))

# Estadios de madurez sexual
sexo <- factor(rep(c("macho", "hembra"), times = 1000),
               levels = c("macho", "hembra"))
               
# Crear data frame
db <- data.frame(region = sample(region, 81), 
                        sexo = sample(sexo, 81), Hg)

# Ordenar base de datos por region
db.reg <- db[order(db$region), ]

# Ordenar base de datos por sexo
db.sexo <- db[order(db$sexo), ]

# Ordenar base de datos por concentración de Hg
db.Hg <- db[order(db$Hg, decreasing = TRUE), ]
db.Hg2 <- db[order(db$Hg, decreasing = T), ]

# Ordenar base de datos por region, sexo y concentración de Hg
db.ord <- db[order(db$region, db$sexo, db$Hg), ]

# Visualizar primeras filas
head(db.ord)
##            region  sexo       Hg
## 38 Pacifico Norte macho 15.50546
## 65 Pacifico Norte macho 15.50546
## 64 Pacifico Norte macho 16.05578
## 15 Pacifico Norte macho 17.23430
## 42 Pacifico Norte macho 17.23430
## 49 Pacifico Norte macho 18.02619
# Resumir datos de la variable concentración de Hg
summary(db.ord$Hg)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   15.51   17.06   19.05   20.13   22.84   27.31
# Calcular el promedio de la variable concentración de Hg
mean(db.ord$Hg)
## [1] 20.13416
# Calcular la desviación estándar de la variable concentración de Hg
sd(db.ord$Hg)
## [1] 3.768815
# Seleccionar la variable mercurio y almacenarla en la variable "c.Hg"
c.Hg <- db.ord[, 3]
c.Hg <- db.ord$Hg

# Calcular el promedio de la concentración de Hg
mean(db.ord[, 3])
## [1] 20.13416
mean(db.ord$Hg)
## [1] 20.13416
mean(c.Hg)
## [1] 20.13416

Manipular Datos: II Parte

Ahora que hemos cubierto algunos conceptos básicos que permiten generar, extraer, resumir y manipular bases de datos, el siguiente paso sería determinar como resumir una variable a través de otra. Por ejemplo, si quisiéramos ver cómo cambia el promedio o la desviación estándar de la concentración de Hg de acuerdo a la región y al sexo:


Función aggregate

Existen varias formas en las que podemos llegar a esto. Por ejemplo, una forma seria por medio de la función aggregate,


# Crear data frame
db <- data.frame(region = sample(factor(rep(c("Pacifico Norte", 
                                              "Pacifico Central", 
                                              "Pacifico Sur"), 
                                            times = 1000), 
                                        levels = c("Pacifico Norte", 
                                                   "Pacifico Central", 
                                                   "Pacifico Sur")), 81),
                        sexo = sample(factor(rep(c("macho", 
                                                   "hembra"), 
                                                 times = 1000),
                                             levels = c("macho", 
                                                        "hembra")), 81), 
                 Hg = rep(runif(n = 27, min = 15, max = 28), times = 3))

# Ordenar base de datos por region, sexo y concentración de Hg
db.ord <- db[order(db$region, db$sexo, db$Hg), ]

# Calcular el promedio de la variable mercurio según la región
aggregate(Hg ~ region, data = db.ord, FUN = mean)
##             region       Hg
## 1   Pacifico Norte 22.69880
## 2 Pacifico Central 20.93967
## 3     Pacifico Sur 22.56902
# Calcular el promedio de la variable mercurio según el sexo
aggregate(Hg ~ sexo, data = db.ord, FUN = mean)  
##     sexo       Hg
## 1  macho 21.41745
## 2 hembra 22.77835
# Calcular la suma de la variable calcio según la región
aggregate(Hg ~ region, data = db.ord, FUN = sum)
##             region       Hg
## 1   Pacifico Norte 522.0724
## 2 Pacifico Central 502.5520
## 3     Pacifico Sur 767.3467
# Calcular la desviación estándar de la variable calcio según el sexo
aggregate(Hg ~ sexo, data = db.ord, FUN = sd)  
##     sexo       Hg
## 1  macho 3.190919
## 2 hembra 3.570042
aggregate(Hg ~ sexo, data = db.ord, FUN = length)  
##     sexo Hg
## 1  macho 39
## 2 hembra 42
aggregate(Hg ~ region, data = db.ord, FUN = length)  
##             region Hg
## 1   Pacifico Norte 23
## 2 Pacifico Central 24
## 3     Pacifico Sur 34
# Calcular el promedio de Hg según región y sexo
dat.mean <- aggregate(Hg ~ region + sexo, data = db.ord, FUN = mean)

# Calcular la desviación estándar de Hg según región y sexo
dat.sd <- aggregate(Hg ~ region + sexo, data = db.ord, FUN = sd)

# Combinar el promedio +/- SD en una sola data.frame (Hint: cbind)
dat.mean.sd <- cbind(dat.mean, dat.sd$Hg)
dat.mean.sd <- cbind(dat.mean, dat.sd[, 3])

# Cambiar los nombres de las variables
names(dat.mean.sd)[4] <- "sd"
dat.mean.sd
##             region   sexo       Hg       sd
## 1   Pacifico Norte  macho 21.81672 3.318996
## 2 Pacifico Central  macho 19.00451 2.186963
## 3     Pacifico Sur  macho 22.02241 3.137686
## 4   Pacifico Norte hembra 23.66107 3.399187
## 5 Pacifico Central hembra 21.73649 3.321906
## 6     Pacifico Sur hembra 23.34989 3.911033
str(dat.mean.sd)
## 'data.frame':    6 obs. of  4 variables:
##  $ region: Factor w/ 3 levels "Pacifico Norte",..: 1 2 3 1 2 3
##  $ sexo  : Factor w/ 2 levels "macho","hembra": 1 1 1 2 2 2
##  $ Hg    : num  21.8 19 22 23.7 21.7 ...
##  $ sd    : num  3.32 2.19 3.14 3.4 3.32 ...
# ¿Cómo calcular error estandar por region y sexo?
dat.n <- aggregate(Hg ~ region + sexo, db.ord, 
               FUN = length)

dat.se <- dat.mean.sd$sd / sqrt(dat.n$Hg)

# Unir base de datos resumida con se
dat.final <- cbind(dat.mean.sd, dat.se)
names(dat.final)[5] <- c("se")

Agreguemos un grado de complejidad más antes de seguir adelante. Ya hemos visto un poco como manipular una base de datos más grande, como resumirla, como explorarla y como extraer filas, columnas o valores específicos. Ahora vamos a tomar la misma base de datos de nuestro ejemplo anterior y vamos a agregar una columna de valores más. En el siguiente ejemplo vamos a manipular una base de datos de mayor complejidad en donde existen dos o más variables numéricas que pueden ser de interés para un análisis estadístico.

Por ejemplo, que tal si además de medir la concentración de Hg de cada pez también medimos su peso. Por lo tanto, vamos a agregar una nueva variable “peso” (kg) a nuestra base de datos, y finalmente, generar una nueva base de datos o data.frame con nuestras variables resumidas.


# Crear data frame
db <- data.frame(region = sample(factor(rep(c("Pacifico Norte", 
                                              "Pacifico Central", 
                                              "Pacifico Sur"), 
                                            times = 1000), 
                                        levels = c("Pacifico Norte", 
                                                   "Pacifico Central", 
                                                   "Pacifico Sur")), 81),
                        sexo = sample(factor(rep(c("macho", 
                                                   "hembra"), 
                                                 times = 1000),
                                             levels = c("macho", 
                                                        "hembra")), 81), 
                 Hg = rep(runif(n = 27, min = 15, max = 28), times = 3))

head(db)
##             region   sexo       Hg
## 1     Pacifico Sur  macho 27.42377
## 2 Pacifico Central  macho 20.65500
## 3     Pacifico Sur  macho 24.42649
## 4 Pacifico Central hembra 27.91097
## 5 Pacifico Central hembra 27.59111
## 6   Pacifico Norte hembra 15.62862
dim(db)
## [1] 81  3
# Crear variable de peso del paciente
peso <- rnorm(n = length(db$Hg), mean = 75, sd = 4.5)

# Crear una nueva base de datos con la nueva variable
db.new <- cbind(db, peso)
head(db.new)
##             region   sexo       Hg     peso
## 1     Pacifico Sur  macho 27.42377 78.72633
## 2 Pacifico Central  macho 20.65500 71.02945
## 3     Pacifico Sur  macho 24.42649 68.15711
## 4 Pacifico Central hembra 27.91097 72.97910
## 5 Pacifico Central hembra 27.59111 74.77025
## 6   Pacifico Norte hembra 15.62862 74.60256
# Calcular el promedio, desviación estándar y error estándar
dat.mean <- aggregate(cbind(Hg, peso) ~ region + sexo, 
                       data = db.new, FUN = mean)

# Desviación estándar
dat.sd <- aggregate(cbind(Hg, peso) ~ region + sexo, 
                     data = db.new, FUN = sd)

names(dat.sd)[3] <- c("sd.Hg")
names(dat.sd)[4] <- c("sd.peso")

# Número de observaciones
dat.N <- aggregate(cbind(Hg, peso) ~ region + sexo, 
                   data = db.new, FUN = length)

# Calcular error estándar
se <- dat.sd[, c(3:4)] / sqrt(dat.N[, c(3:4)]) 
names(se) <- c("se.Hg", "se.peso")

# Guardar todas las estadísticas calculadas en una nueva base de datos
dat.resumidas <- cbind(dat.mean, dat.sd[, c(3:4)], se)

names(dat.resumidas)
## [1] "region"  "sexo"    "Hg"      "peso"    "sd.Hg"   "sd.peso" "se.Hg"  
## [8] "se.peso"
dat.resumidas2 <- dat.resumidas[ , c(1:3, 5, 7, 4, 6, 8)]

dat.resumidas2 <- dat.resumidas[ , c("region", "sexo", "Hg",
                                     "sd.Hg", "se.Hg", "peso",
                                     "sd.peso", "se.peso")]
dat.resumidas2
##             region   sexo       Hg    sd.Hg     se.Hg     peso  sd.peso
## 1   Pacifico Norte  macho 23.38836 4.397616 1.3906483 76.29866 3.657711
## 2 Pacifico Central  macho 23.73620 3.625945 0.7251891 75.54777 4.234344
## 3     Pacifico Sur  macho 24.05602 3.874961 1.0356268 75.45444 5.179755
## 4   Pacifico Norte hembra 22.22129 4.628278 1.5427594 78.15053 4.584971
## 5 Pacifico Central hembra 24.65041 3.930217 1.0147776 74.94569 3.231248
## 6     Pacifico Sur hembra 25.51829 2.658227 0.9398250 73.25707 3.335438
##     se.peso
## 1 1.1566696
## 2 0.8468689
## 3 1.3843479
## 4 1.5283235
## 5 0.8343045
## 6 1.1792553

 

Ejercicios


  1. Crear un data.frame llamado DF que contenga 5 columnas y 10 filas. Las dos primeras columnas serán categóricas y tendran la siguiente información: col1 = secuencia de letras minúsculas; col2 = sequencia de letras mayúsculas. Las últimas dos columnas serán númericas y tendrán la siguiente información: col3 = secuencia númerica que inicie en 2 y termine en 20; col4 = sequencia que inicie en 5 y termine en 35, pero que vaya de 3 en 3 hasta completar la última fila.


  1. Utilice la base de datos DF para realizar lo siguiente: (i) cambie los nombres de la columna 1 a “región”, columna 2 a “país”, columna 3 a “indice” y columna 4 a “peso”; (ii) seleccione todas las filas de la columna 1 y la columna 4 y guardela en el objeto DF1; (iii) seleccione todas las columnas de la base de datos DF cuyo país sea “D”, “E”, “F” y “J”; seleccione todas las columnas y filas correspondientes cuyo índice sea menor a 11.


  1. Utilice la base de datos DF para realizar seleccionar todas las regiones y países cuyo índice es mayor a 5 y peso menor a 42.5.


  1. Crear una nueva columna y agregarla a la base de datos DF que contenga al menos 3 secuencias de 3 letras minúsculas repetidas, y llame a esa columna “grupo”. ¿Cuál es el peso promedio y desviación estándar de la nueva columna creada “grupo”? Crear un objeto results que contenga sus cálculos de promedio y desviación estándar.


Función tapply

La función tapply pertenece a una familia muy versatil de funciones que le permitirá manipular, resumir y realizar una serie de cálculos rápidos sobre bases de datos de gran tamaño. Para más información de las aplicaciones de estás funciones ver los siguientes enlances:


# Crear data frame
db.new <- data.frame(region = sample(factor(rep(c("Pacifico Norte", 
                                              "Pacifico Central", 
                                              "Pacifico Sur"), 
                                            times = 1000), 
                                        levels = c("Pacifico Norte", 
                                                   "Pacifico Central", 
                                                   "Pacifico Sur")), 81),
                        sexo = sample(factor(rep(c("macho", 
                                                   "hembra"), 
                                                 times = 1000),
                                             levels = c("macho", 
                                                        "hembra")), 81), 
                 Hg = rep(runif(n = 27, min = 15, max = 28), times = 3),
                 peso = rnorm(n = 81, mean = 75, sd = 4.5))

head(db.new)
##             region   sexo       Hg     peso
## 1     Pacifico Sur  macho 25.95211 77.53469
## 2     Pacifico Sur hembra 25.26942 76.87708
## 3   Pacifico Norte  macho 18.87204 73.58725
## 4 Pacifico Central  macho 16.48124 80.60527
## 5   Pacifico Norte hembra 22.23763 75.44624
## 6     Pacifico Sur  macho 21.76903 74.09210
# Crear una lista
A <- list(db.new$region, db.new$sexo, db.new$Hg, db.new$peso)
A[[1]]
##  [1] Pacifico Sur     Pacifico Sur     Pacifico Norte   Pacifico Central
##  [5] Pacifico Norte   Pacifico Sur     Pacifico Central Pacifico Central
##  [9] Pacifico Sur     Pacifico Sur     Pacifico Norte   Pacifico Norte  
## [13] Pacifico Central Pacifico Norte   Pacifico Central Pacifico Sur    
## [17] Pacifico Central Pacifico Sur     Pacifico Sur     Pacifico Sur    
## [21] Pacifico Central Pacifico Sur     Pacifico Sur     Pacifico Sur    
## [25] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Central
## [29] Pacifico Central Pacifico Central Pacifico Norte   Pacifico Central
## [33] Pacifico Central Pacifico Sur     Pacifico Central Pacifico Norte  
## [37] Pacifico Central Pacifico Central Pacifico Sur     Pacifico Sur    
## [41] Pacifico Sur     Pacifico Central Pacifico Sur     Pacifico Central
## [45] Pacifico Sur     Pacifico Central Pacifico Sur     Pacifico Central
## [49] Pacifico Central Pacifico Central Pacifico Sur     Pacifico Sur    
## [53] Pacifico Central Pacifico Norte   Pacifico Sur     Pacifico Sur    
## [57] Pacifico Central Pacifico Central Pacifico Central Pacifico Central
## [61] Pacifico Central Pacifico Central Pacifico Sur     Pacifico Sur    
## [65] Pacifico Norte   Pacifico Norte   Pacifico Central Pacifico Central
## [69] Pacifico Central Pacifico Central Pacifico Central Pacifico Sur    
## [73] Pacifico Sur     Pacifico Central Pacifico Sur     Pacifico Norte  
## [77] Pacifico Norte   Pacifico Central Pacifico Sur     Pacifico Sur    
## [81] Pacifico Central
## Levels: Pacifico Norte Pacifico Central Pacifico Sur
A[[4]]
##  [1] 77.53469 76.87708 73.58725 80.60527 75.44624 74.09210 71.88837 81.02788
##  [9] 75.99046 83.71433 79.02091 73.67385 82.33340 69.72510 77.23857 69.52092
## [17] 74.14431 77.69280 76.46522 81.76838 72.98577 71.58026 70.25351 72.77013
## [25] 74.87297 72.83184 83.23279 64.40872 77.94941 81.20448 78.64159 84.20880
## [33] 80.38808 71.48182 72.60973 72.86154 73.16517 77.12000 71.61849 68.84201
## [41] 76.70888 75.95612 77.51148 77.47957 82.98122 70.01775 79.85303 74.04118
## [49] 77.20975 84.23343 81.86210 75.64406 74.77184 71.98282 71.38433 70.50079
## [57] 75.30344 74.45427 71.48702 71.01603 79.90822 75.03073 79.33206 75.29117
## [65] 76.94227 78.53267 69.47522 73.98121 73.56390 75.08388 67.24225 72.79342
## [73] 76.80887 76.56652 72.16723 71.46950 65.61039 73.82846 77.70604 76.71547
## [81] 77.74894
# Calcular promedio y DE con tapply
dat.mean <- tapply(db.new$Hg, 
                     list(db.new$region, db.new$sexo), 
                     mean)
dat.mean
##                     macho   hembra
## Pacifico Norte   19.15773 22.97079
## Pacifico Central 21.43581 21.73481
## Pacifico Sur     22.06062 23.83077
# Desviación estándar variable "Hg"
sd.mean <- tapply(db.new$Hg, 
                     list(db.new$region, db.new$sexo), 
                     sd)
sd.mean
##                     macho   hembra
## Pacifico Norte   3.694385 2.638484
## Pacifico Central 3.865228 3.885729
## Pacifico Sur     3.241140 2.707553
# ¿Cómo calcular el promedio y desviación estándar simultáneamente con tapply?

# Solución 1
dat.summary1 <- data.frame(cbind(mean = tapply(db.new$Hg, 
                                               list(db.new$region, 
                                                    db.new$sexo), mean),
                                 sd = tapply(db.new$Hg, 
                                             list(db.new$region,
                                                  db.new$sexo), sd)))
                
names(dat.summary1) <- c("mean.Hg.H", "mean.Hg.M",
                         "sd.Hg.H", "sd.Hg.M")

# Solución 2
dat.summary2 <- data.frame(rbind(mean = tapply(db.new$Hg, 
                                               list(db.new$region, 
                                                    db.new$sexo), mean),
                                 sd = tapply(db.new$Hg, 
                                             list(db.new$region,
                                                  db.new$sexo), sd)))
                
rownames(dat.summary2) <- c("mean.P.Norte", "mean.P.Central", "mean.P.Sur",
                            "sd.P.Norte", "sd.P.Central", "sd.P.Sur")

Función ddply

La función ddply es otra función versatil para manipular y resumir grandes bases de datos. Está función pertenece al paquete o librería plyr, el cual deberá cargar antes de usarlo.

Para más información de las aplicaciones de está función ver los siguientes enlances:


library(plyr)

# Crear data frame
db.new <- data.frame(region = sample(factor(rep(c("Pacifico Norte", 
                                              "Pacifico Central", 
                                              "Pacifico Sur"), 
                                            times = 1000), 
                                        levels = c("Pacifico Norte", 
                                                   "Pacifico Central", 
                                                   "Pacifico Sur")), 81),
                        sexo = sample(factor(rep(c("macho", 
                                                   "hembra"), 
                                                 times = 1000),
                                             levels = c("macho", 
                                                        "hembra")), 81), 
                 Hg = rep(runif(n = 27, min = 15, max = 28), times = 3),
                 peso = rnorm(n = 81, mean = 75, sd = 4.5))

# Calcular promedio de la concentración de Hg por región y sexo
d <- ddply(db.new, .(region, sexo), 
           plyr::summarise,
           mean.Hg = round(mean(Hg), 2),
           sd.Hg = round(sd(Hg), 2),
           se.Hg = round(sd(Hg) / sqrt(length(Hg)), 2),
           n.Hg = length(Hg),
           mean.peso = round(mean(peso), 2),
           sd.peso = round(sd(peso), 2),
           se.peso = round(sd(peso) / sqrt(length(peso)), 2))
             
d
##             region   sexo mean.Hg sd.Hg se.Hg n.Hg mean.peso sd.peso se.peso
## 1   Pacifico Norte  macho   22.58  3.68  0.84   19     77.07    3.98    0.91
## 2   Pacifico Norte hembra   22.00  4.13  1.38    9     75.32    5.11    1.70
## 3 Pacifico Central  macho   21.97  4.07  1.05   15     74.26    4.37    1.13
## 4 Pacifico Central hembra   21.00  4.30  1.19   13     74.53    2.70    0.75
## 5     Pacifico Sur  macho   23.09  3.49  0.97   13     76.69    6.56    1.82
## 6     Pacifico Sur hembra   22.07  3.65  1.05   12     74.30    3.71    1.07

Ya con los ejemplos que hemos cubierto tenemos un mejor conocimiento de algunas funciones útiles para manipular y resumir bases de datos. Estas son herramientas básicas, pero esenciales para poder enfrentarnos a bases de datos más complejos con muchas variables. Nuestro fin siempre debe ser tratar de resumir la información que tenemos para analizar y presentarla (por medio de cuadros y figuras) a una audiencia específica. En la siguiente sección cubriremos algunas funciones que nos permitirán visualizar bases de datos con diferente estructura.


Métodos de Visualización en R

En esta sección usaremos algunos de los ejemplos anteriores para hacer gráficos que nos permitan resumir y presentar visualmente la información. Volviendo al ejemplo de la concentración de calcio de pacientes con cáncer y el peso corporal, a continuación, vamos a visualizar un poco la distribución de los datos.


Histogramas

Una de las funciones más útiles e importantes cuando tenemos una variable numérica es la función hist que genera un histograma de la distribución de los datos.


# Crear data frame
db.new <- data.frame(region = sample(factor(rep(c("Pacifico Norte", 
                                              "Pacifico Central", 
                                              "Pacifico Sur"), 
                                            times = 1000), 
                                        levels = c("Pacifico Norte", 
                                                   "Pacifico Central", 
                                                   "Pacifico Sur")), 81),
                        sexo = sample(factor(rep(c("macho", 
                                                   "hembra"), 
                                                 times = 1000),
                                             levels = c("macho", 
                                                        "hembra")), 81), 
                 Hg = rep(runif(n = 27, min = 15, max = 28), times = 3),
                 peso = rnorm(n = 81, mean = 75, sd = 4.5))

# Histograma mercurio
hist(db.new$Hg)

hist(db.new[, 3])

# Histograma peso
hist(db.new$peso)

hist(db.new[,4])


Podemos accesar los comandos de ayuda para tener un mejor conocimiento de todos los parámetros asociados a la función hist, la cual es una función compleja en donde se pueden especificar muchas opciones. Podemos manipular mejor esta función para mejorar la presentación de nuestros gráficos.

Por ejemplo, podemos cambiar el nombre a los ejes (axes) y agregar un título.


hist(db.new$Hg, xlab = "Concentración de Hg (mg Hg/100 ml)", 
     ylab = "Frecuencia",
     main = "Histograma de la concentración de Hg")

hist(db.new$peso, xlab = "Peso corporal (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso corporal")

hist(db.new$Hg, xlab = "Concentración de Hg (mg Hg/100 ml)", 
     ylab = "Frecuencia (%)",
     main = "", freq = FALSE)


Podemos usar otras opciones con la función hist para cambiar/mejorar aún más la presentación. Podemos hacer la letra más grande, usar expresiones en letra itálica o negrita, cambiar el color de las barras, etc.

Por ejemplo, las opciones cex.axis y cex.lab cambian el tamaño de los números en los ejes y del texto/nombre de los ejes, respectivamente. Valores más altos aumentan más el tamaño del texto. La expresión col controla el color de las barras, mientras que la opción border puede cambiar el color de los bordes de las barras. Para más información acerca de la gama de colores disponible en R y opciones de como especificar colores consulten los siguientes links:


hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces",
     freq = T, cex.axis = 0.8, cex.lab = 1.2)

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 0.8, cex.lab = 0.95)

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces",
     freq = T, 
     cex.axis = 1.2, cex.lab = 1.2,
     col = "#43B2FC85")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces",
     freq = T, 
     cex.axis = 1.2, cex.lab = 1.2,
     col = "lightblue")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, 
     cex.axis = 1.2, cex.lab = 1.2,
     col = "yellow")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "#1D70AF")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "#1D70AF90")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "#90EE90")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "#90EE90", border = "#43B2FC")

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col ="black", border = "black", density = 10)

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "blue", border = "red", density = 5, angle = 90,
     lwd = 4)

### Line thickness - histogram ###
line <- par(lwd = 8)

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col = "blue", border = "red", density = 5, angle = 45)

box(bty = "l", lwd = 10)


Cuando presentamos o evaluamos nuestros datos mediante gráficos de histogramas a veces nos interesa también manipular el número de barras o categorías. Esto requiere un poco más de esfuerzo, pero una vez que entendemos el trasfondo, resulta muy sencillo.

Por ejemplo, podemos variar el número de categorías/barras mediante la opción “breaks”,


range(db.new$peso)
## [1] 63.74324 86.05588
dev.off()
## null device 
##           1
hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.85,
     col ="grey90", border = "black", 
     breaks = 10, xlim = c(60, 85), ylim = c(0, 16))

box(bty = "l", lwd = 2)

hist(db.new$peso, xlab = "Peso (kg)", 
     ylab = "Frecuencia",
     main = "Histograma del peso de peces", 
     freq = T, cex.axis = 1.2, cex.lab = 1.2,
     col ="grey90", border = "black", 
     breaks = 15)

Boxplot-density plots

Otros gráficos que podemos hacer para evaluar la distribución de nuestros datos son gráficos de density y boxplot.

Por ejemplo, siguiendo nuestro ejemplo del tamaño de los parásitos podemos generar facílmente un gráfico de densidad y un boxplot de la siguiente forma:


# Density plot
plot(density(db.new$Hg))

plot(density(db.new$peso), ylab = "Frecuencia")

plot(density(db.new$peso), ylab = "Frecuencia", 
     col = "blue", main = "El titulo que quieren poner...",
     lwd = 10)

plot(density(db.new$peso), xlab = "Frecuencia", 
     col = "#7D146A50", cex.axis = 1.2, cex.lab = 1.4,
     main = "", lwd = 25, lty = 3) 

# Boxplot
boxplot(db.new$peso, ylab = "Peso")

boxplot(db.new$peso, ylab = "Frecuencia", col = "forestgreen")

boxplot(db.new$peso, xlab = "Frecuencia", col = "yellow", 
        horizontal = TRUE)

# Manipular elementos del gráfico
levels(db.new$region)
## [1] "Pacifico Norte"   "Pacifico Central" "Pacifico Sur"
col.g1 <- c("green", "blue", "grey80") # definir colores
col.g2 <- c("GREEN", "blue", "grey80") # definir colores

boxplot(db.new$peso ~ db.new$region, 
        xlab = "Peso", col = col.g2, horizontal = TRUE,
        cex.axis = 1.2, cex.lab = 1.4, 
        main = "El mejor grafico del mundo")

boxplot(db.new$peso ~ db.new$region, 
        xlab = "Peso", col = c("grey20", "grey50", "grey90"),
        cex.axis = 1.2, cex.lab = 1.4, 
        main = "El mejor grafico del mundo")


db.new$region <- factor(db.new$region, levels = c("Pacifico Norte",
                                                  "Pacifico Central",
                                                  "Pacifico Sur"))

levels(db.new$region)
## [1] "Pacifico Norte"   "Pacifico Central" "Pacifico Sur"
boxplot(peso ~ region, data = db.new)

boxplot(peso ~ sexo, data = db.new)

boxplot(peso ~ region + sexo, data = db.new)

str(db.new)
## 'data.frame':    81 obs. of  4 variables:
##  $ region: Factor w/ 3 levels "Pacifico Norte",..: 1 3 1 1 3 3 2 2 1 2 ...
##  $ sexo  : Factor w/ 2 levels "macho","hembra": 2 1 2 1 1 2 1 1 1 1 ...
##  $ Hg    : num  18.2 20.6 28 21.2 21.9 ...
##  $ peso  : num  70.8 72.7 79.2 81.2 85.8 ...
boxplot(peso ~ region + sexo, data = db.new,
        horizontal = TRUE, cex.axis = 0.6, las = 2,
        col = c("blue", "blue", "blue", "red", "red", "red"))

boxplot(peso ~ region + sexo, data = db.new,
        horizontal = TRUE, cex.axis = 0.6, las = 2,
        col = c(rep("blue", 3), rep("green", 3)))

boxplot(peso ~ region, data = db.new, 
         xlab = "Frecuencia", col = "yellow", horizontal = T,
        cex.axis = 1.2, cex.lab = 1.4)

levels(db.new$sexo)
## [1] "macho"  "hembra"
boxplot(peso ~ sexo, data = db.new, 
         xlab = "Frecuencia", col = "yellow", horizontal = FALSE,
        cex.axis = 1.2, cex.lab = 1.4, las = 2,
        names = c("M-acho", "H-embra"))

boxplot(peso ~ region, data = db.new, 
         xlab = "Frecuencia", 
        col = c("yellow", "blue", "forestgreen"), 
        horizontal = T,
        cex.axis = 1.2, cex.lab = 1.4,
        names = c("PN", "Central", "Sur"))


range.peso <- range(db.new$peso)
str(range.peso)
##  num [1:2] 63.7 86.1
range.peso[1]
## [1] 63.74324
range.peso[2]
## [1] 86.05588
# Editar elementos del gráfico
boxplot(peso ~ region, data = db.new, 
        col = "gray95", ylim = c(range.peso[1], range.peso[2]), 
        xlab = "", ylab = "",
        xaxt = "n", yaxt = "n", frame.plot = F)

boxplot(peso ~ region, data = db.new, 
        col = "gray95", ylim = c((range.peso[1] - 2.5), (range.peso[2] + 2.5)), 
        xlab = "", ylab = "",
        xaxt = "n", yaxt = "n", frame.plot = F)

axis(1, at = seq(1, 3, by = 1), 
     labels = c("P. Norte", 
                "P. Central", 
                "P. Sur"), 
     cex.axis = 1.2)

axis(2, at = seq(60, 100, by = 5), las = 1) # agregar axis 2 (las = 1, posici?n horizontal vs. las = 2, posición vertical)

#axis(3)
#axis(4)

# Crear títulos de ejes
mtext("Region", side = 1, line = 2, cex = 1.25)
mtext("Peso", side = 2, line = 2.6, cex = 1.5)

box(bty = "l", lwd = 2)


R también permite ordenar y visualizar varios gráficos en una misma página. Por ejemplo, si quisiéramos visualizar un gráfico de boxplot que muestre el tamaño de los parásitos en un panel y el tamaño de los peces en otro podemos usar la función par. Esta función permite manipular las opciones de los márgenes de página y del número de gráficos por página y las dimensiones del gráfico. Existen varios recursos disponibles en donde podemos obtener más información acerca de la función par:

Por ahora veremos ejemplos específicos en donde solo vamos a controlar algunos de los parámetros más comunes: mar. Este parámetro permite ajustar los márgenes de la página. Existen 4 márgenes que hay que especificar de acuerdo a su posición (abajo, izquierda, arriba y derecha) en la página. Entre más pequeño es el valor que se le asigna al margen, más cerca del borde (inferior, derecho, superior e izquierdo) de la página estará el gráfico.


# Establecer margenes
par(mfcol = c(1, 1))
#par(mfrow = c(1, 1))

par(mar = c(6, 5, 1.5, 0))

boxplot(peso ~ region, data = db.new, 
        col = "gray95",
        xlab = "", ylab = "",
        type = "n",xaxt = "n", yaxt = "n", 
        frame.plot = F, main = "Ejemplo 1")
        
axis(1, at = seq(1, 3, by = 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1.2)

axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.5)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.5)

box(bty="l",lwd=1.1)


# Establecer margenes
par(mfcol = c(1, 1))
par(mar = c(6, 5, 3, 3))

boxplot(peso ~ region, data = db.new, col = "gray95",
        xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F, 
        main = "Ejemplo 2")
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1.2)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.5)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.5)

box(bty = "l",lwd = 1.1)


# Establecer margenes
par(mfcol = c(1, 1))
par(mar = c(12, 5, 12, 3))

boxplot(peso ~ region, data = db.new, col = "gray95",
        xlab = "", ylab = "",
        type = "n", xaxt= "n", yaxt = "n", frame.plot = F, main = "Ejemplo 3")
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1.2)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.5)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.5)

box(bty = "l",lwd = 1.1)


# Establecer margenes
par(mfcol = c(1, 1))
par(mar = c(5, 12, 5, 12))

boxplot(peso ~ region, data = db.new, col = "gray95",
        xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F, main = "Ejemplo 4")
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1.2)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.5)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.5)

box(bty = "l",lwd = 1.1)


Los siguientes ejemplos nos ayudarán a entender como posicionar/colocar 2 o más figuras en una página. Para eso debemos ajustar los márgenes y también tenemos que dividir la página en filas y/o columnas. El parámetro que controla el número de figuras que vamos a visualizar en una página es par(mfcol) o par(mfrow). El primero ordena las figuras de acuerdo a columnas, el segundo de acuerdo a filas.


# Establecer margenes
par(mfcol = c(2, 1))
par(mar = c(2, 6, 1, 4))

# Gráfico 1
boxplot(peso ~ region, data = db.new, xlab = "", ylab = "",
        col = c("yellow", "red", "blue"),
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"),
     cex.axis = 1)
axis(2, las=1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l", lwd = 1.1)

# Gráfico 2
boxplot(Hg ~ region, data = db.new, xlab = "", ylab = "",
        col = c("gray95", "gray50", "gray25"),
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l",lwd = 1.1)


# Ojo el cambio entre mfcol y mfrow!
par(mfcol = c(2, 2)) 
par(mar = c(5, 6, 1.5, 4))

# Gráfico 1
boxplot(peso ~ region, data = db.new, col = "gray95", 
        xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l", lwd = 1.1)

# Gráfico 2
boxplot(Hg ~ region, data = db.new, col = "gray95",
                xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l",lwd = 1.1)

# Gráfico 3
hist(db.new$peso, xlab = "", ylab = "", col = "grey90", 
     xaxt = "n", yaxt = "n", main = "",
     border = "black", breaks = 10)

# Sobreponer un gráfico sobre otro
par(new = TRUE)

plot(density(db.new$peso), xaxt = "n", yaxt = "n", 
     main = "", col = "red", ylab = "", xlab = "",
     lwd = 4, frame.plot = F)

axis(1, cex.axis = 1)     
axis(2, las = 1)

mtext("Frecuencia", side = 1, line = 3, cex = 1.25)
mtext("Densidad", side = 2, line = 3, cex = 1.25)

box(bty = "l",lwd = 1.1)

# Gráfico 4
hist(db.new$Hg, xlab = "", ylab = "", col = "#FFBC00", 
     xaxt = "n", yaxt = "n", main = "",
     border = "black", breaks = 10)

# Sobreponer un gráfico sobre otro
par(new = T)

plot(density(db.new$Hg), xaxt = "n", yaxt = "n", 
     main = "", col = "#003366", ylab = "", xlab = "",
     lwd = 3, lty = 2, frame.plot = F)

axis(1, cex.axis = 1)     
axis(2, las = 1)

mtext("Frecuencia", side = 1, line = 3, cex = 1.25)
mtext("Densidad", side = 2, line = 3, cex = 1.25)

box(bty = "l",lwd = 1.1)


Para terminar esta sección, veremos cómo podemos generar y exportar figuras de alta calidad usando R. Este programa nos permite exportar figuras en múltiples formatos. A continuación, se presentarán dos formatos de alta resolución en los cuales podemos generar figuras para una publicación.

# Exportar gráfico en formato de PNG
png("Boxplot-Histograms por sitio.png", width = 10, height = 8, 
    units = "in", res = 600)

# Parámetros de los márgenes
par(mfrow = c(2, 2))
par(mar = c(3, 4, 2, 2), oma = c(3, 2, 0, 1))

# Gráfico 1
boxplot(peso ~ region, data = db.new, col = "gray95",
        xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l", lwd = 1.1)

# Gráfico 2
boxplot(peso ~ region, data = db.new, col = "gray95",        
        xlab = "", ylab = "",
        type = "n", xaxt = "n", yaxt = "n", frame.plot = F)
        
axis(1, at = seq(1, 3, 1), 
     labels = c("Pacifico Norte", "Pacifico Central", "Pacifico Sur"), 
     cex.axis = 1)
axis(2, las = 1)

mtext("Region", side = 1, line = 3, cex = 1.25)
mtext("Frecuencia", side = 2, line = 2.6, cex = 1.25)

box(bty = "l",lwd = 1.1)

# Gráfico 3
hist(db.new$peso, col = "grey90",         
     xlab = "", ylab = "",
     xaxt = "n", yaxt = "n", main = "",
     border = "black", breaks = 10)

# Sobreponer un gráfico sobre otro
par(new = T)

plot(density(db.new$peso), xaxt = "n", yaxt = "n", 
     main = "", col = "red", ylab = "", xlab = "",
     lwd = 3, frame.plot = F)

axis(1, cex.axis = 1)     
axis(2, las = 1)

mtext("Frecuencia", side = 1, line = 3, cex = 1.25)
mtext("Densidad", side = 2, line = 3, cex = 1.25)

box(bty = "l",lwd = 1.1)

# Gráfico 4
hist(db.new$Hg, xlab = "", ylab = "", col = "#FFBC00", 
     xaxt = "n", yaxt = "n", main = "",
     border = "black", breaks = 10)

# Sobreponer un gráfico sobre otro
par(new = T)

plot(density(db.new$Hg), xaxt = "n", yaxt = "n", 
     main = "", col = "#003366", ylab = "", xlab = "",
     lwd = 4, lty = 2, frame.plot = F)

axis(1, cex.axis = 1)     
axis(2, las = 1)

mtext("Frecuencia", side = 1, line = 3, cex = 1.25)
mtext("Densidad", side = 2, line = 3, cex = 1.25)

box(bty = "l",lwd = 1.1)

# Cerrar "device"
dev.off() 

Otros formato muy empleado es el siguiente:


### Formato de PNG ###
png("Boxplot-sitios2.png", width = 8.5, height = 11, units = "in", res = 600)

# Insertar código del gráfico aquí!

dev.off()

Importar y Exportar Datos

En esta sección se pretende mostrar algunas formas en las que podemos importar y exportar datos en R. Muchas veces tenemos bases de datos externas en diversos formatos (csv, txt, excel, SPSS, etc.) y nos interesa poder accesar a esas bases de datos desde R. Los formatos csv y txt son de los más usados. Estos formatos también pueden ser accesados desde programas como Excel, lo cual permite cierta manipulación y editaje previo a ser importados en R.


Especificar folder de trabajo

Cuando empezamos a trabajar en R lo primero de que deberíamos hacer es especificar el folder de trabajo. Este sería el folder donde vamos a guardar todos nuestros resultados, donde vamos a importar/exportar archivos o simplemente el folder que estará unido a nuestro código de trabajo.

Para eso debemos usar los siguientes comandos:


# Especificar el folder de trabajo
setwd(choose.dir())

# Especificar folder de trabajo
wd <- "/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/" 
setwd(wd)

A continuación, emplearemos tres métodos para importar el set de datos “peakquinn” que fue guardado en el directorio de trabajo con los formatos csv, txt y xls. NOTA: Es muy importante que sepamos cual es el directorio en donde estamos trabando y que tengamos nuestros archivos (“bases de datos”) en ese mismo directorio. Para eso podemos usar la función getwd() que significa “get the working directory”.


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")

# Seleccionar folder de trabajo
wd <- getwd()
setwd(wd)

# Importar datos - formato "csv"
inv <- read.csv("peakquinn.csv", header = T, sep = ",")

# Resumir base de datos
head(inv)
str(inv)
summary(inv)

Ahora vamos a importar la misma base de datos que fue guardada como txt.


# Seleccionar folder de trabajo
setwd(wd)

# Importar datos - formato "txt"
inv.txt <- read.table("peakquinn.txt", header = T, sep = "")
head(inv.txt)
str(inv.txt)

# Seleccionar las primeras 10 filas de la base de datos
inv.sel <- inv.txt[1:10, ]
inv.sel

A continuación vamos a importar un set de datos que guardamos en excel. Para esto vamos a usar la función read_excel del paquete readxl.


# Seleccionar folder de trabajo
setwd(wd)

# Instalar/cargar librerías o paquetes
library(readxl)

# Importar datos - formato "excel"
inv.excel <- read_excel("peakquinn.xlsx", sheet = 1)
head(inv.excel)
str(inv.excel)

Por último, vamos a usar un método más dinámico para importar datos. Este método nos permite seleccionar manualmente el archivo que queremos importar.


inv <- read.csv(choose.files(), header = TRUE, sep = ",")
head(inv)
str(inv)

Para exportar nuestras bases de datos y/o resultados como archivos csv o txt podemos usar los siguientes códigos:


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")

wd <- getwd()
setwd(wd)

# Importar datos - formato "csv"
escuelas <- read.csv("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/escuelas.csv", header = T, sep = ",", stringsAsFactors = TRUE)

# Resumir base de datos
head(escuelas)
##   location          school    type    subtype zone year year2 score
## 1  Cartago Anglo americano Privado ACAD.DIUR.  URB   10    10  9.50
## 2  Cartago Anglo americano Privado ACAD.DIUR.  URB   10    10  4.00
## 3  Cartago Anglo americano Privado ACAD.DIUR.  URB   11    11  7.00
## 4  Cartago Anglo americano Privado ACAD.DIUR.  URB   11    11  1.00
## 5  Cartago Anglo americano Privado ACAD.DIUR.  URB   11    11  7.75
## 6  Cartago Anglo americano Privado ACAD.DIUR.  URB   11    11  6.25
str(escuelas)
## 'data.frame':    859 obs. of  8 variables:
##  $ location: Factor w/ 12 levels "Alajuela","C. Neily",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ school  : Factor w/ 118 levels "Anglo americano",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ type    : Factor w/ 3 levels "Cientifico","Privado",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ subtype : Factor w/ 3 levels "","ACAD.DIUR.",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ zone    : Factor w/ 3 levels "NR","RUR","URB": 3 3 3 3 3 3 3 3 3 3 ...
##  $ year    : int  10 10 11 11 11 11 11 11 11 11 ...
##  $ year2   : int  10 10 11 11 11 11 11 11 11 11 ...
##  $ score   : num  9.5 4 7 1 7.75 6.25 6.75 6.5 3.5 3 ...
summary(escuelas)
##      location                                                school   
##  San Jose:131   Colegio Cientifico Sede Guanacaste              : 39  
##  Heredia :107   Cientifico Costarricense Sede Atlantico         : 38  
##  Cartago : 94   NR                                              : 31  
##  Liberia : 93   Colegio Marista                                 : 18  
##  Alajuela: 76   Colegio Cientifico Costarricense Sede Puntarenas: 17  
##  Limon   : 71   Colegio Cientifico de Alajuela                  : 17  
##  (Other) :287   (Other)                                         :699  
##          type             subtype     zone          year           year2     
##  Cientifico:174               : 23   NR : 31   Min.   : 7.00   Min.   : 8.0  
##  Privado   :349   ACAD.DIUR.  :792   RUR:155   1st Qu.:10.00   1st Qu.:10.0  
##  Publico   :336   T\x83C.DIUR.: 44   URB:673   Median :10.00   Median :10.0  
##                                                Mean   :10.11   Mean   :10.1  
##                                                3rd Qu.:11.00   3rd Qu.:11.0  
##                                                Max.   :12.00   Max.   :11.0  
##                                                                              
##      score       
##  Min.   : 0.000  
##  1st Qu.: 4.500  
##  Median : 6.500  
##  Mean   : 6.432  
##  3rd Qu.: 8.500  
##  Max.   :12.500  
## 
dim(escuelas)
## [1] 859   8
# Seleccionar sola los colegios cientificos
cientificos <- escuelas[escuelas$type == "Cientifico", ]

head(cientificos)
##    location                           school       type    subtype zone year
## 61  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   10
## 62  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   10
## 63  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   10
## 64  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   11
## 65  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   11
## 66  Cartago Cientifico Costarricense Cartago Cientifico ACAD.DIUR.  URB   11
##    year2 score
## 61    10  9.00
## 62    10 11.00
## 63    10  6.75
## 64    11 11.25
## 65    11  4.50
## 66    11  9.50
str(cientificos)
## 'data.frame':    174 obs. of  8 variables:
##  $ location: Factor w/ 12 levels "Alajuela","C. Neily",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ school  : Factor w/ 118 levels "Anglo americano",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ type    : Factor w/ 3 levels "Cientifico","Privado",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ subtype : Factor w/ 3 levels "","ACAD.DIUR.",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ zone    : Factor w/ 3 levels "NR","RUR","URB": 3 3 3 3 3 3 3 3 3 3 ...
##  $ year    : int  10 10 10 11 11 11 11 11 11 11 ...
##  $ year2   : int  10 10 10 11 11 11 11 11 11 11 ...
##  $ score   : num  9 11 6.75 11.25 4.5 ...
dim(cientificos)
## [1] 174   8
# Remover los niveles vacios de un factor
cientificos$type <- factor(cientificos$type)
str(cientificos)
## 'data.frame':    174 obs. of  8 variables:
##  $ location: Factor w/ 12 levels "Alajuela","C. Neily",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ school  : Factor w/ 118 levels "Anglo americano",..: 9 9 9 9 9 9 9 9 9 9 ...
##  $ type    : Factor w/ 1 level "Cientifico": 1 1 1 1 1 1 1 1 1 1 ...
##  $ subtype : Factor w/ 3 levels "","ACAD.DIUR.",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ zone    : Factor w/ 3 levels "NR","RUR","URB": 3 3 3 3 3 3 3 3 3 3 ...
##  $ year    : int  10 10 10 11 11 11 11 11 11 11 ...
##  $ year2   : int  10 10 10 11 11 11 11 11 11 11 ...
##  $ score   : num  9 11 6.75 11.25 4.5 ...
# Seleccionar colegios privados, y solo el año 11
priv.11 <- escuelas[escuelas$type == "Privado" &
                      escuelas$year2 == 11, ]

getwd()
## [1] "/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio"
# Exportar base de colegios científicos y colegios privados (11 año)
name1 <- "cientificos2.csv"
write.csv(cientificos, file = name1, row.names = TRUE)  

name2 <- "priv11.txt"
write.table(priv.11, file = name2, row.names = TRUE, sep = "\t")  

 

Ejercicios


  1. Importe la base de datos temp.co2.csv y realice un gráfico tipo boxplot en donde la temperatura este en el eje x y el CO2 producido en el eje y. Nota: Debe tratar la temperatura como un factor con varios niveles.
R/ (no mirar…)


  1. Importe la base de datos escuelas.csv y realice un gráfico tipo boxplot para examinar la relación entre el tipo de colegio (“type” = privado, cientifico y publico) y la evaluación (“score”). Nota: Coloree cada nivel del factor tipo de colegio con un color distinto.
R/ (no mirar…)



Graficación: II parte

En esta sección continuaremos abordando el tema de graficación, y mostraremos otros ejemplos en los que podemos generar gráficos más complejos en R. A continuación, discutiremos gráficos de puntos (scatter plots), gráficos circulares (“pie charts”) y gráficos de barras (barplot). Estos gráficos usan las funciones plot, pie y barplot, respectivamente. Estos gráficos se usan mucho cuando queremos mostrar visualmente los resultados de pruebas estadísticas univariadas como Regresión (simple y múltiple), Análisis de Varianza (ANDEVA), “General Linear Models (GLMs)”, “Generalized Linear Models (GLMM)”, etc. Muchas de las opciones de las funciones para graficar en R son similares, sin embargo, también veremos algunas opciones o parámetros que son específicas de cada una de las funciones.


Gráficos de puntos

El siguiente ejemplo proviene de un set de datos de Peake and Quinn (1993), en el cual los autores querían investigar la relación entre el número de invertebrados que se encontraban en parches de mejillones en una zona rocosa intermareal y el área de esos parches (mm2).

Para examinar la relación entre el número de invertebrados y el área de los parches de mejillones podemos usar un gráfico scatterplot con la función plot. Para esta función tenemos que especificar los valores/coordenadas de x y y.

Primero, vamos a importar nuestra base de datos “peakquinn.csv”:


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar base de datos
peakquinn <- read.csv("peakquinn.csv", header = T, sep = ";")
str(peakquinn)
## 'data.frame':    25 obs. of  2 variables:
##  $ AREA : num  516 469 462 939 1357 ...
##  $ INDIV: int  18 60 57 100 48 118 148 214 225 283 ...
# Gráfico de puntos (x/y)
dev.off()
## null device 
##           1
# Establecer márgenes
par(mfrow = c(1, 1))

# Gráfico 1
plot(x = peakquinn$AREA, y = peakquinn$INDIV)

hist(peakquinn$AREA)
hist(peakquinn$INDIV)
boxplot(peakquinn$INDIV)

# Gráfico 2
plot(peakquinn$AREA, peakquinn$INDIV)

# Gráfico 3
plot(INDIV ~ AREA, peakquinn)

Cuando usamos la función plot podemos especificar diferentes tipos de gráficos mediante el parámetro type. Para más información acerca de la función plot y los tipos de gráficos asociados consultar la documentación en R. Por ejemplo,


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar base de datos
peakquinn <- read.csv("peakquinn.csv", header = T, sep = ";")

# Gráfico 4
plot(INDIV ~ AREA, data = peakquinn, type = "l", main = "Gráfico 1")

# Gráfico 5
plot(INDIV ~ AREA, data = peakquinn, type = "b", main = "Gráfico 2")

# Gráfico 6
plot(INDIV ~ AREA, data = peakquinn, type = "o", main = "Gráfico 3")


A través de R podemos editar/modificar todas las opciones de un gráfico para mejorar la presentación. Esto nos da un control muy grande cuando queremos personalizar uno o varios gráficos. Por ejemplo,


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar base de datos
peakquinn <- read.csv("peakquinn.csv", header = T, sep = ";")

# Base de datos
head(peakquinn)
##      AREA INDIV
## 1  516.00    18
## 2  469.06    60
## 3  462.25    57
## 4  938.60   100
## 5 1357.15    48
## 6 1773.66   118
dim(peakquinn)
## [1] 25  2
# Seleccionar un subset aleatorio de ambas variables
area1 <- sample(peakquinn$AREA, size = (length(peakquinn$AREA) - 10))
ind1 <- sample(peakquinn$INDIV, size = (length(peakquinn$INDIV) - 10))

# Gráfico
par(mar = c(5, 5, 3, 2))

plot(INDIV ~ AREA, data = peakquinn, xlim = c(0, 30000),
     ylim = c(0, 1600),
     ann = FALSE, axes = FALSE, type = "n")

points(INDIV ~ AREA, data = peakquinn, pch = 21, 
       col = "blue", bg = "yellow", cex = 3, lwd = 3)

points(ind1 ~ area1, pch = 22, 
       col = "black", bg = "#ff000090", cex = 3)

axis(1, at = seq(0, 30000, 2500))

mtext(expression(paste("Area del parche (",mm^2,")")), side = 1, 
      line = 3, cex = 1.2)

axis(2, at = seq(0, 1600, 200), las = 1)

mtext("Número de invertebrados", 2, line = 3.5, cex = 1.2)

box(bty = "l", lwd = 2)


Sospechamos que una transformación logarítmica podría mejorar la relación lineal entre el número de invertebrados y el área del parche de mejillones. Por lo tanto, vamos a transformar ambas variables para ver si mejora esta relación.


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar base de datos
peakquinn <- read.csv("peakquinn.csv", header = T, sep = ";")

# Transformación logarítmica de ambas variables
logArea <- log(peakquinn$AREA)
logInd <- log (peakquinn$INDIV)

# Agregar variables trasformadas a la base de datos
head(peakquinn)
##      AREA INDIV
## 1  516.00    18
## 2  469.06    60
## 3  462.25    57
## 4  938.60   100
## 5 1357.15    48
## 6 1773.66   118
peakquinn$logArea <- logArea
peakquinn$logInd <- logInd

peakquinn2 <- peakquinn[, c(1:2)]
peakquinn <- peakquinn2

head(peakquinn)
##      AREA INDIV
## 1  516.00    18
## 2  469.06    60
## 3  462.25    57
## 4  938.60   100
## 5 1357.15    48
## 6 1773.66   118
# Graficar la relación de las variables transformadas
par(mar = c(5,5,3,2))

plot(logInd ~ logArea, data = peakquinn, 
     ann = F, axes = F, type = "n")

points(logInd ~ logArea, data = peakquinn, pch = 23, 
       col = "black", bg = "green",
       cex = 2)

axis(1)

mtext(expression(paste("Log área (", mm^2,")", sep = "")), 1, 
      line = 3, cex = 1.2)

axis(2, las = 1)

mtext("Log Número de invertebrados", 2, line = 3.5, cex = 1.2)

box(bty = "l", lwd = 2)

# Parámetros de los gráficos
par(mfrow = c(1, 2))
par(mar = c(5,5,5,1))

# Gráfico sin las variables transformación
plot(INDIV ~ AREA, data = peakquinn, ann = F, axes = F, type = "n")
points(INDIV ~ AREA, data = peakquinn, pch = 21, 
       col = "black", bg = "yellow",cex = 1.3)

axis(1)

mtext(expression(paste("Area del parche (",mm^2,")", sep = "")), 1, 
      line = 3, cex = 1)

axis(2,las = 1)

mtext("Número de invertebrados", 2, line = 3.5, cex = 1)

box(bty = "l")

### Graficar con las variables transformadas ###
plot(logInd ~ logArea, data = peakquinn, ann = F, axes = F, type = "n")

points(logInd ~ logArea, data = peakquinn, pch = 21, 
       col = "black", bg = "tomato",cex = 1.3)

axis(1)

mtext(expression(paste("Log Area (",mm^2,")", sep = "")), 1, 
      line = 3, cex = 1)

axis(2,las=1)

mtext("Log Número de invertebrados", 2, line = 3.5, cex = 1)

box(bty="l")

###

dev.off()
## null device 
##           1
par(mar = c(5, 5, 5, 1))

plot(logInd ~ logArea, data = peakquinn, ann = F, axes = F, type = "n")

points(logInd ~ logArea, data = peakquinn, pch = 21, 
       col = "black", bg = "tomato",cex = 2.5)

axis(1)

mtext(expression(paste("Log Area (",mm^2,")", sep = "")), 1, 
      line = 3, cex = 1)

axis(2,las=1)

mtext("Log Número de invertebrados", 2, line = 3.5, cex = 1)

box(bty="l")


lm.peak <- lm(logInd ~ logArea, data = peakquinn)
summary(lm.peak)
## 
## Call:
## lm(formula = logInd ~ logArea, data = peakquinn)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.9983 -0.1488  0.0511  0.2574  0.6175 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -1.32632    0.59645  -2.224   0.0363 *  
## logArea      0.83492    0.07066  11.816 3.01e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4274 on 23 degrees of freedom
## Multiple R-squared:  0.8586, Adjusted R-squared:  0.8524 
## F-statistic: 139.6 on 1 and 23 DF,  p-value: 3.007e-11
str(lm.peak)
## List of 12
##  $ coefficients : Named num [1:2] -1.326 0.835
##   ..- attr(*, "names")= chr [1:2] "(Intercept)" "logArea"
##  $ residuals    : Named num [1:25] -0.998 0.285 0.246 0.217 -0.825 ...
##   ..- attr(*, "names")= chr [1:25] "1" "2" "3" "4" ...
##  $ effects      : Named num [1:25] -28.243 5.05 0.306 0.317 -0.704 ...
##   ..- attr(*, "names")= chr [1:25] "(Intercept)" "logArea" "" "" ...
##  $ rank         : int 2
##  $ fitted.values: Named num [1:25] 3.89 3.81 3.8 4.39 4.7 ...
##   ..- attr(*, "names")= chr [1:25] "1" "2" "3" "4" ...
##  $ assign       : int [1:2] 0 1
##  $ qr           :List of 5
##   ..$ qr   : num [1:25, 1:2] -5 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 ...
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : chr [1:25] "1" "2" "3" "4" ...
##   .. .. ..$ : chr [1:2] "(Intercept)" "logArea"
##   .. ..- attr(*, "assign")= int [1:2] 0 1
##   ..$ qraux: num [1:2] 1.2 1.31
##   ..$ pivot: int [1:2] 1 2
##   ..$ tol  : num 1e-07
##   ..$ rank : int 2
##   ..- attr(*, "class")= chr "qr"
##  $ df.residual  : int 23
##  $ xlevels      : Named list()
##  $ call         : language lm(formula = logInd ~ logArea, data = peakquinn)
##  $ terms        :Classes 'terms', 'formula'  language logInd ~ logArea
##   .. ..- attr(*, "variables")= language list(logInd, logArea)
##   .. ..- attr(*, "factors")= int [1:2, 1] 0 1
##   .. .. ..- attr(*, "dimnames")=List of 2
##   .. .. .. ..$ : chr [1:2] "logInd" "logArea"
##   .. .. .. ..$ : chr "logArea"
##   .. ..- attr(*, "term.labels")= chr "logArea"
##   .. ..- attr(*, "order")= int 1
##   .. ..- attr(*, "intercept")= int 1
##   .. ..- attr(*, "response")= int 1
##   .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
##   .. ..- attr(*, "predvars")= language list(logInd, logArea)
##   .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
##   .. .. ..- attr(*, "names")= chr [1:2] "logInd" "logArea"
##  $ model        :'data.frame':   25 obs. of  2 variables:
##   ..$ logInd : num [1:25] 2.89 4.09 4.04 4.61 3.87 ...
##   ..$ logArea: num [1:25] 6.25 6.15 6.14 6.84 7.21 ...
##   ..- attr(*, "terms")=Classes 'terms', 'formula'  language logInd ~ logArea
##   .. .. ..- attr(*, "variables")= language list(logInd, logArea)
##   .. .. ..- attr(*, "factors")= int [1:2, 1] 0 1
##   .. .. .. ..- attr(*, "dimnames")=List of 2
##   .. .. .. .. ..$ : chr [1:2] "logInd" "logArea"
##   .. .. .. .. ..$ : chr "logArea"
##   .. .. ..- attr(*, "term.labels")= chr "logArea"
##   .. .. ..- attr(*, "order")= int 1
##   .. .. ..- attr(*, "intercept")= int 1
##   .. .. ..- attr(*, "response")= int 1
##   .. .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
##   .. .. ..- attr(*, "predvars")= language list(logInd, logArea)
##   .. .. ..- attr(*, "dataClasses")= Named chr [1:2] "numeric" "numeric"
##   .. .. .. ..- attr(*, "names")= chr [1:2] "logInd" "logArea"
##  - attr(*, "class")= chr "lm"
#abline(h = 5, lwd = 3, col = "blue", lty = 2)
#abline(v = 8.5, lwd = 3, col = "green", lty = 3)
#abline(v = c(7, 9, 10.1), lwd = 3, col = "forestgreen", lty = 3)

abline(a = -1.3263, b = 0.8349, lwd = 6, col = "#2EA7EC60", lty = 2)

abline(a = lm.peak$coefficients[1], b = lm.peak$coefficients[2], 
       lwd = 6, col = "#EC392E50", lty = 2)

abline(lm.peak)

Gráficos circulares

El uso de gráficos circulares o pasteles es bastante común para resumir datos de porcentajes. A veces se presenta un gráfico circular para mostrar, por ejemplo, que en una muestra el 50% de la población son machos y el 50% hembras. En este caso realmente este es un gráfico multivariable que puede utilizarse para comparar diferencias o similitudes y realizar agrupamientos.

En R podemos generar un gráfico circular con la función pie. Pensemos en un set de datos en donde medimos el peso de pacientes con uan enfermedad degenerativa, clasificamos el peso como: bajo (<60 kg), medio (60-90 kg), alto (90-120 kg) y sobre-peso (>120 kg).


# Crear un vector de 1000 pesos
peso.kg <- c("bajo", "medio", "alto", "sobre-peso")
peso.df <- rep(peso.kg, 1000)

# Seleccionar solo 100 pesos
peso.sel <- factor(sample(peso.df, 100, replace = F))

# Ordenar los niveles del factor temperatura
levels(peso.sel)
## [1] "alto"       "bajo"       "medio"      "sobre-peso"
peso.sel <- factor(peso.sel, levels = c("bajo", "medio", "alto", "sobre-peso"))
levels(peso.sel)
## [1] "bajo"       "medio"      "alto"       "sobre-peso"
# Estimar la frecuencia de cada temperatura
frec.peso <- table(peso.sel)

# Generar un gráfico circular
par(mfrow = c(1, 1))
par(mar = c(1, 1, 1, 1))

pie(frec.peso, col = c("yellow", "forestgreen", "skyblue", "pink"))

# Escoger colores usando paletas predefinidas
pie(frec.peso, col = rainbow(4), radius = 1) # 4 colores

pie(frec.peso, col = heat.colors(4), radius = 1)

pie(frec.peso, col = terrain.colors(4), radius = 0.5)

pie(frec.peso, col = topo.colors(4), radius = 0.9)

pie(frec.peso, col = cm.colors(4), radius = 1)

# Importar librerías de colores
library(viridis)
## Loading required package: viridisLite

library(wesanderson)

pie(frec.peso, col = viridis(4),
    labels = c("<60 kg", "60-90 kg", "90-120 kg", ">120 kg"), 
    radius = 1)

pie(frec.peso, col = wes_palette(name = "FantasticFox1"),
    labels = c("<60 kg", "60-90 kg", "90-120 kg", ">120 kg"), 
    radius = 1)

pie(frec.peso, col = wes_palette(name = "Zissou1"),
    labels = c("<60 kg", "60-90 kg", "90-120 kg", ">120 kg"), 
    radius = 1)

pie(frec.peso, col = wes_palette(name = "GrandBudapest1"),
    labels = c("<60 kg", "60-90 kg", "90-120 kg", ">120 kg"), 
    radius = 1)


Gráficos de barras

La función Barplot produce gráficos de mucha utilidad para resumir y comparar visualmente promedios entre niveles de factores. A continuación vamos a usar el set de datos “ElasmosCR.csv” para ilustrar como se hacen los gráficos de barras. Para ello vamos a graficar la variable d15N (concentración del isótopo de nitrógeno 15), y ver variaciones entre especies.


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar datos - formato "csv"
elasmos.cr <- read.csv("ElasmosCR.csv", header = T, sep = ",",
                       stringsAsFactors = TRUE)

# Resumir base de datos
head(elasmos.cr)
##                Zone Area      X        Y season     lat      long  depth
## 1 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 2 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 3 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 4 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 5 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
## 6 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
##               order    family         species  sex      stage   TL weight
## 1 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.6    420
## 2 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.5    380
## 3 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 52.9    400
## 4 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.4    340
## 5 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 47.3    320
## 6 Carcharhiniformes Triakidae Mustelus henlei Male 1-Immature 31.7     81
##        d13C     d15N
## 1 -16.37962 15.37705
## 2 -16.13817 15.49575
## 3 -15.73031 15.13844
## 4 -16.20531 15.28515
## 5 -16.40551 15.45999
## 6 -16.70021 14.66036
str(elasmos.cr)
## 'data.frame':    294 obs. of  17 variables:
##  $ Zone   : Factor w/ 3 levels "1-North Pacific",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Area   : Factor w/ 4 levels "I","II","III",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ X      : num  494270 494270 494270 494270 494270 ...
##  $ Y      : num  986032 986032 986032 986032 986032 ...
##  $ season : Factor w/ 2 levels "Summer","Winter": 2 2 2 2 1 1 1 1 1 1 ...
##  $ lat    : num  9.31 9.31 9.31 9.31 8.52 ...
##  $ long   : num  -84.2 -84.2 -84.2 -84.2 -83.9 ...
##  $ depth  : num  89.8 89.8 89.8 89.8 252.4 ...
##  $ order  : Factor w/ 4 levels "Carcharhiniformes",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ family : Factor w/ 4 levels "Rajidae","Rhinobatidae",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ species: Factor w/ 4 levels "Mustelus henlei",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex    : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 1 1 2 1 ...
##  $ stage  : Factor w/ 2 levels "1-Immature","2-Mature": 2 2 2 2 2 1 1 1 1 1 ...
##  $ TL     : num  50.6 50.5 52.9 50.4 47.3 31.7 35.6 29.1 25.5 31.7 ...
##  $ weight : num  420 380 400 340 320 81 156 66 53.4 114 ...
##  $ d13C   : num  -16.4 -16.1 -15.7 -16.2 -16.4 ...
##  $ d15N   : num  15.4 15.5 15.1 15.3 15.5 ...
# Niveles del factor "species"
levels(elasmos.cr$species)
## [1] "Mustelus henlei" "Raja velezi"     "Torpedo peruana" "Zapteryx xyster"
# Agregar base de datos para calcular el promedio
db <- aggregate(d15N ~ species, data = elasmos.cr, FUN = mean)

# Importar librerías
library(wesanderson)

# Altura de las barras
xx <- db$d15N

# Niveles del factor
v <- as.character(levels(db$species))

# Barplot 1
par(mfrow = c(1, 1))
par(mar = c(5, 5, 3, 2))

barplot(xx, col = wes_palette(4), 
        xlab = "Especie", ylab = "d15N",
        names.arg = v, las = 1)

box(bty="l")

# Barplot 2
barplot(xx, col = wes_palette(4), 
        xlab = "Especie", ylab = "d15N",
        ylim = c(0, 30),
        names.arg=v, las = 1)

box(bty="l")

# Barplot 3
barplot(xx, col = wes_palette(4), 
        xlab = "Especie", ylab = "d15N",
        ylim = c(14, 16),
        names.arg = v, las = 1, xpd = F)

box(bty="l")

# Importar librería
library(viridis)

# Barplot
par(mfrow = c(1, 1))
par(mar = c(5, 8, 3, 2))

# Gráfico 1
barplot(xx, col = c("black", "White", "grey35", "grey95"), 
        ylab = "", 
        xlab = "d15N", 
        xlim = c(14, 16), horiz = T,
        names.arg = v, 
        las = 1, xpd = F)

box(bty="l")

# Gráfico 2
barplot(xx, col = viridis(4), 
        ylab = "", 
        xlab = "d15N", 
        xlim = c(14, 16), horiz = T,
        names.arg = v, 
        las = 1, xpd = F)

box(bty="l")


A continuación, veremos otras situaciones en donde tenemos dos factores en lugar de uno. Por ejemplo, ahora nos interesa ver la concentración del isótopo d15N por especie y estadio de madurez (juvenil / inmaduro y adulto / maduro). Además, vamos a calcular la desviación estándard (y error estándard) y graficar ambos (promedio +/- SD).

En este ejemplo vamos a usar una función muy útil para agrupar datos de acuerdo a uno o más factores, la función tapply. Esta función pertenece a una familia muy diversa de funciones denominada apply dentro del paquete plyr: (eapply, lapply, sapply, vapply, mapply, rapply, tapply). Durante las siguientes prácticas trataremos de cubrir algunas de estas funciones. Para más información acerca de las funciones de la familia apply consultar los siguientes recursos disponibles:

https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r
http://blog.datacamp.com/r-tutorial-apply-family


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar datos - formato "csv"
elasmos.cr <- read.csv("ElasmosCR.csv", header = T, sep = ",",
                       stringsAsFactors = TRUE)

# Resumir base de datos
head(elasmos.cr)
##                Zone Area      X        Y season     lat      long  depth
## 1 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 2 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 3 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 4 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 5 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
## 6 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
##               order    family         species  sex      stage   TL weight
## 1 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.6    420
## 2 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.5    380
## 3 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 52.9    400
## 4 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.4    340
## 5 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 47.3    320
## 6 Carcharhiniformes Triakidae Mustelus henlei Male 1-Immature 31.7     81
##        d13C     d15N
## 1 -16.37962 15.37705
## 2 -16.13817 15.49575
## 3 -15.73031 15.13844
## 4 -16.20531 15.28515
## 5 -16.40551 15.45999
## 6 -16.70021 14.66036
str(elasmos.cr)
## 'data.frame':    294 obs. of  17 variables:
##  $ Zone   : Factor w/ 3 levels "1-North Pacific",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Area   : Factor w/ 4 levels "I","II","III",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ X      : num  494270 494270 494270 494270 494270 ...
##  $ Y      : num  986032 986032 986032 986032 986032 ...
##  $ season : Factor w/ 2 levels "Summer","Winter": 2 2 2 2 1 1 1 1 1 1 ...
##  $ lat    : num  9.31 9.31 9.31 9.31 8.52 ...
##  $ long   : num  -84.2 -84.2 -84.2 -84.2 -83.9 ...
##  $ depth  : num  89.8 89.8 89.8 89.8 252.4 ...
##  $ order  : Factor w/ 4 levels "Carcharhiniformes",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ family : Factor w/ 4 levels "Rajidae","Rhinobatidae",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ species: Factor w/ 4 levels "Mustelus henlei",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex    : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 1 1 2 1 ...
##  $ stage  : Factor w/ 2 levels "1-Immature","2-Mature": 2 2 2 2 2 1 1 1 1 1 ...
##  $ TL     : num  50.6 50.5 52.9 50.4 47.3 31.7 35.6 29.1 25.5 31.7 ...
##  $ weight : num  420 380 400 340 320 81 156 66 53.4 114 ...
##  $ d13C   : num  -16.4 -16.1 -15.7 -16.2 -16.4 ...
##  $ d15N   : num  15.4 15.5 15.1 15.3 15.5 ...
# Cambiar 1-Immature a juvenile y 2-Mature a adulto
elasmos.cr$stage2 <- elasmos.cr$stage

levels(elasmos.cr$stage2) <- c("Juvenil", "Adulto")

head(elasmos.cr)
##                Zone Area      X        Y season     lat      long  depth
## 1 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 2 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 3 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 4 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 5 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
## 6 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
##               order    family         species  sex      stage   TL weight
## 1 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.6    420
## 2 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.5    380
## 3 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 52.9    400
## 4 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.4    340
## 5 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 47.3    320
## 6 Carcharhiniformes Triakidae Mustelus henlei Male 1-Immature 31.7     81
##        d13C     d15N  stage2
## 1 -16.37962 15.37705  Adulto
## 2 -16.13817 15.49575  Adulto
## 3 -15.73031 15.13844  Adulto
## 4 -16.20531 15.28515  Adulto
## 5 -16.40551 15.45999  Adulto
## 6 -16.70021 14.66036 Juvenil
# Separar variables de acuerdo a "x", "y" y "z"
x <- elasmos.cr$species
y <- elasmos.cr$d15N
z <- elasmos.cr$stage2

# Altura de las barras
xx <- tapply(y, list(z, x), mean)

# Desviación estándard
yy <- tapply(y, list(z, x), sd)

# Número de replicas
zz <- tapply(y, list(z, x), length)

# Error estándard
er <- (yy / sqrt(zz))

# Nombres de especies
spp <- as.character(levels(elasmos.cr$species))

# Crear gráfico
par(mfrow = c(1, 1))
par(mar = c(5, 5, 3, 2))

barx <- barplot(xx, col = c("tomato", "skyblue2"), beside = TRUE,
        xlab = "Especies", ylab = "d15N", 
        ylim = c(14, 16.5),
        names.arg = spp, las = 1, yaxs = "i", xpd = FALSE)

# Barras de error
arrows(barx, xx + yy, barx, xx, angle = 90, code = 1, length = 0.05)

box(bty = "l")


¿Qué tal si quisiéramos poner una leyenda dentro del gráfico? Existen varias formas de poner una leyenda asociada a un gráfico. En el próximo ejemplo veremos cómo poner una leyenda con la función legend. En esta función tenemos que especificar las coordenadas (x,y) dentro del gráfico (también se puede poner leyendas fuera del gráfico) en donde queremos ubicar la leyenda. Esto generalmente es un proceso de prueba/error. Sin embargo, también se pueden usar algunas las funciones asociadas como grconvertX y grconvertY que tienen un mayor control del espacio dentro de un gráfico.


# Especificar el folder de trabajo
setwd("/Users/mario/OneDrive - Universidad de Costa Rica/Curso R-Avanzado/Curso 2022/Manuales del Curso/Manual Introductorio/")
wd <- getwd()
setwd(wd)

# Importar datos - formato "csv"
elasmos.cr <- read.csv("ElasmosCR.csv", header = T, sep = ",",
                       stringsAsFactors = TRUE)

# Resumir base de datos
head(elasmos.cr)
##                Zone Area      X        Y season     lat      long  depth
## 1 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 2 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 3 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 4 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 5 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
## 6 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
##               order    family         species  sex      stage   TL weight
## 1 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.6    420
## 2 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.5    380
## 3 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 52.9    400
## 4 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.4    340
## 5 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 47.3    320
## 6 Carcharhiniformes Triakidae Mustelus henlei Male 1-Immature 31.7     81
##        d13C     d15N
## 1 -16.37962 15.37705
## 2 -16.13817 15.49575
## 3 -15.73031 15.13844
## 4 -16.20531 15.28515
## 5 -16.40551 15.45999
## 6 -16.70021 14.66036
str(elasmos.cr)
## 'data.frame':    294 obs. of  17 variables:
##  $ Zone   : Factor w/ 3 levels "1-North Pacific",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ Area   : Factor w/ 4 levels "I","II","III",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ X      : num  494270 494270 494270 494270 494270 ...
##  $ Y      : num  986032 986032 986032 986032 986032 ...
##  $ season : Factor w/ 2 levels "Summer","Winter": 2 2 2 2 1 1 1 1 1 1 ...
##  $ lat    : num  9.31 9.31 9.31 9.31 8.52 ...
##  $ long   : num  -84.2 -84.2 -84.2 -84.2 -83.9 ...
##  $ depth  : num  89.8 89.8 89.8 89.8 252.4 ...
##  $ order  : Factor w/ 4 levels "Carcharhiniformes",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ family : Factor w/ 4 levels "Rajidae","Rhinobatidae",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ species: Factor w/ 4 levels "Mustelus henlei",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ sex    : Factor w/ 2 levels "Female","Male": 2 2 2 2 2 2 1 1 2 1 ...
##  $ stage  : Factor w/ 2 levels "1-Immature","2-Mature": 2 2 2 2 2 1 1 1 1 1 ...
##  $ TL     : num  50.6 50.5 52.9 50.4 47.3 31.7 35.6 29.1 25.5 31.7 ...
##  $ weight : num  420 380 400 340 320 81 156 66 53.4 114 ...
##  $ d13C   : num  -16.4 -16.1 -15.7 -16.2 -16.4 ...
##  $ d15N   : num  15.4 15.5 15.1 15.3 15.5 ...
# Cambiar 1-Immature a juvenile y 2-Mature a adulto
elasmos.cr$stage2 <- elasmos.cr$stage

levels(elasmos.cr$stage2) <- c("Juvenil", "Adulto")

head(elasmos.cr)
##                Zone Area      X        Y season     lat      long  depth
## 1 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 2 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 3 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 4 2-Central Pacific  III 494270 986031.6 Winter 9.31405 -84.21855  89.76
## 5 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
## 6 2-Central Pacific  III 494270 986031.6 Summer 8.52032 -83.88766 252.45
##               order    family         species  sex      stage   TL weight
## 1 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.6    420
## 2 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.5    380
## 3 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 52.9    400
## 4 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 50.4    340
## 5 Carcharhiniformes Triakidae Mustelus henlei Male   2-Mature 47.3    320
## 6 Carcharhiniformes Triakidae Mustelus henlei Male 1-Immature 31.7     81
##        d13C     d15N  stage2
## 1 -16.37962 15.37705  Adulto
## 2 -16.13817 15.49575  Adulto
## 3 -15.73031 15.13844  Adulto
## 4 -16.20531 15.28515  Adulto
## 5 -16.40551 15.45999  Adulto
## 6 -16.70021 14.66036 Juvenil
# Separar variables de acuerdo a "x", "y" y "z"
x <- elasmos.cr$species
y <- elasmos.cr$d15N
z <- elasmos.cr$stage2

# Altura de las barras
xx <- tapply(y, list(z, x), mean)

# Desviación estándard
yy <- tapply(y, list(z, x), sd)

# Número de replicas
zz <- tapply(y, list(z, x), length)

# Error estándard
er <- (yy / sqrt(zz))

# Nombres de especies
spp <- as.character(levels(elasmos.cr$species))

# Crear gráfico
par(mfrow = c(1, 1))
par(mar = c(5, 5, 3, 2))

barx <- barplot(xx, col = c("tomato", "skyblue2"), beside = T,
        xlab = "Especies", ylab = "d15N", 
        ylim = c(14, 16.5),
        names.arg = spp, las = 1, yaxs = "i", xpd = F)

# Barras de error
arrows(barx, xx + yy, barx, xx, angle = 90, code = 1, length = 0.05)

# Coordenadas de leyenda
X1 <- grconvertX(0.20, "npc") # controla la ubicación en el eje "X"
Y1 <- grconvertY(1, "npc") # controla la ubicación en el eje "y"

# Generar una leyenda
legend(X1, Y1, fill = c("tomato", "skyblue2"), bty = "n",
       cex = 1.1,legend = c("Juv", "Adult"))

#legend(X1, Y1, pch = c(15, 16),
#       col = c("tomato", "skyblue2"), 
#       bty = "n",
#       cex = 1.1,legend = c("Juv", "Adult"))


box(bty = "l")