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] 228.56667 269.88788 631.44848 528.14545 962.01818 135.59394 52.95152
## [8] 641.77879 683.10000 858.71515 879.37576 786.40303 114.93333 621.11818
## [15] 889.70606 466.16364 187.24545 807.06364 579.79697 104.60303
# Crear vector aleatorio con 20 elementos numéricos (replace = TRUE)
v.nuevo2b <- sample(v.nuevo, size = 20, replace = TRUE)
v.nuevo2b## [1] 507.4848 259.5576 610.7879 724.4212 125.2636 982.6788 993.0091
## [8] 1013.6697 1.3000 342.2000 776.0727 869.0455 331.8697 176.9152
## [15] 269.8879 962.0182 796.7333 590.1273 714.0909 631.4485
# Forma más directa
v.nuevoc <- sample(seq(1.3, 1024, l = 100), 20, replace = FALSE)
v.nuevoc## [1] 610.78788 156.25455 817.39394 600.45758 94.27273 321.53939 631.44848
## [8] 280.21818 373.19091 63.28182 259.55758 197.57576 724.42121 569.46667
## [15] 486.82424 218.23636 869.04545 962.01818 362.86061 135.59394
Ejercicios
- Crear un vector
vque contenga la secuencia de 1 a 6 repetida 5 veces.
- Crear un vector
ven donde se repita cada número de la secuencia de 25-250 tres veces.
- Crear un vector
vque contenga 10 números aleatorios que varían entre -100 y 100. La secuencia de números no se pueden repetir.
- Crear un vector de caracteres llamado
v.carque contenga la siguiente secuencia de palabras: “a”, “la”, “mayoria”, “de”, “las”, “personas”, “no”, “les”, “gusta”, “la”, “programacion”. Una vez creado el vectorv.car, seleccione las palabras “a”, “las”, “personas”, “les”, “gusta”, y lo guarda en un nuevo vectorv.car2.
- Cree un vector
v.nuevoque contenga los vectoresv1,v2,v3yv4que fueron creados anteriormente.
- Utilice la función
seqpara crear un vectorv.seqque contenga solo los elementos impares del vectorv10, 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] FALSE TRUE FALSE FALSE FALSE TRUE TRUE TRUE 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] 20.8 17.2 19.2 20.4 18.0
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
- 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
sampleyseqpara 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.
- 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] 18
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 61 70
## 2 89 50
## 3 60 57
## 4 82 77
## 5 77 71
## 6 74 79
## 7 78 47
## 8 76 68
## 9 66 67
## 10 99 54
str(db)## 'data.frame': 10 obs. of 2 variables:
## $ hombres: int 61 89 60 82 77 74 78 76 66 99
## $ mujeres: int 70 50 57 77 71 79 47 68 67 54
# Crear matriz
db2 <- cbind(hombres, mujeres)
db2## hombres mujeres
## [1,] 61 70
## [2,] 89 50
## [3,] 60 57
## [4,] 82 77
## [5,] 77 71
## [6,] 74 79
## [7,] 78 47
## [8,] 76 68
## [9,] 66 67
## [10,] 99 54
str(db2)## int [1:10, 1:2] 61 89 60 82 77 74 78 76 66 99 ...
## - 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
- Usando el
data.frame“df” que habiamos creado anteriormente, seleccione solo la columna con la información de provincia.
- Seleccione la provincia que esta en la cuarta fila
- Seleccione toda la información de Marta, Tati y Esteban
- Seleccione los estudiantes que tienen más de 30 años
- Seleccione los hombres que tienen más de 30 años
- 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] 27.3 21.4 21.4 19.9 20.6 ...
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 macho 27.33458
## 2 Pacifico Sur hembra 21.35341
## 3 Pacifico Central macho 21.44534
## 4 Pacifico Norte macho 19.94688
## 5 Pacifico Sur hembra 20.60346
tail(db)## region sexo Hg
## 76 Pacifico Norte hembra 21.72007
## 77 Pacifico Sur macho 19.39650
## 78 Pacifico Central macho 20.75710
## 79 Pacifico Sur hembra 17.26800
## 80 Pacifico Sur hembra 20.34609
## 81 Pacifico Norte hembra 18.06329
summary(db)## region sexo Hg
## Pacifico Norte :18 macho :43 Min. :15.91
## Pacifico Central:30 hembra:38 1st Qu.:19.88
## Pacifico Sur :33 Median :20.76
## Mean :21.61
## 3rd Qu.:23.73
## Max. :27.88
# 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 3 2 1 3 1 1 3 3 2 ...
## $ sexo : Factor w/ 2 levels "macho","hembra": 1 2 1 1 2 1 1 1 1 1 ...
## $ Hg : num 27.3 21.4 21.4 19.9 20.6 ...
head(db)## region sexo Hg
## 1 Pacifico Norte macho 27.33458
## 2 Pacifico Sur hembra 21.35341
## 3 Pacifico Central macho 21.44534
## 4 Pacifico Norte macho 19.94688
## 5 Pacifico Sur hembra 20.60346
## 6 Pacifico Norte macho 20.53587
db$region## [1] Pacifico Norte Pacifico Sur Pacifico Central Pacifico Norte
## [5] Pacifico Sur Pacifico Norte Pacifico Norte Pacifico Sur
## [9] Pacifico Sur Pacifico Central Pacifico Norte Pacifico Norte
## [13] Pacifico Sur Pacifico Sur Pacifico Sur Pacifico Norte
## [17] Pacifico Central Pacifico Sur Pacifico Sur Pacifico Central
## [21] Pacifico Sur Pacifico Central Pacifico Sur Pacifico Central
## [25] Pacifico Sur Pacifico Central Pacifico Sur Pacifico Sur
## [29] Pacifico Sur Pacifico Norte Pacifico Central Pacifico Central
## [33] Pacifico Central Pacifico Central Pacifico Norte Pacifico Central
## [37] Pacifico Norte Pacifico Sur Pacifico Norte Pacifico Central
## [41] Pacifico Central Pacifico Central Pacifico Central Pacifico Central
## [45] Pacifico Central Pacifico Sur Pacifico Central Pacifico Sur
## [49] Pacifico Central Pacifico Central Pacifico Norte Pacifico Sur
## [53] Pacifico Central Pacifico Central Pacifico Sur Pacifico Central
## [57] Pacifico Sur Pacifico Norte Pacifico Sur Pacifico Sur
## [61] Pacifico Sur Pacifico Central Pacifico Norte Pacifico Sur
## [65] Pacifico Sur Pacifico Norte Pacifico Sur Pacifico Sur
## [69] Pacifico Central Pacifico Central Pacifico Sur Pacifico Sur
## [73] Pacifico Central Pacifico Norte Pacifico Central Pacifico Norte
## [77] Pacifico Sur Pacifico Central Pacifico Sur Pacifico Sur
## [81] Pacifico Norte
## 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 3 2 1 3 1 1 3 3 2 ...
## $ sexo : Factor w/ 2 levels "M","H": 1 2 1 1 2 1 1 1 1 1 ...
## $ Hg : num 27.3 21.4 21.4 19.9 20.6 ...
## $ Hg2 : num 13.67 10.68 10.72 9.97 10.3 ...
## $ reg.sex : chr "PN-M" "PS-H" "PC-M" "PN-M" ...
## $ reg.sex2: Factor w/ 43 levels "PC-H.18","PC-H.20",..: 26 31 12 23 31 24 22 40 39 8 ...
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
## 67 Pacifico Norte macho 15.66570
## 73 Pacifico Norte macho 16.26208
## 77 Pacifico Norte macho 23.78156
## 79 Pacifico Norte macho 24.79332
## 54 Pacifico Norte macho 25.14937
## 20 Pacifico Norte macho 25.66603
# Resumir datos de la variable concentración de Hg
summary(db.ord$Hg)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 15.28 17.19 22.77 21.47 25.15 27.77
# Calcular el promedio de la variable concentración de Hg
mean(db.ord$Hg)## [1] 21.47062
# Calcular la desviación estándar de la variable concentración de Hg
sd(db.ord$Hg)## [1] 3.899677
# 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] 21.47062
mean(db.ord$Hg)## [1] 21.47062
mean(c.Hg)## [1] 21.47062
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 21.51712
## 2 Pacifico Central 20.79777
## 3 Pacifico Sur 20.07051
# Calcular el promedio de la variable mercurio según el sexo
aggregate(Hg ~ sexo, data = db.ord, FUN = mean) ## sexo Hg
## 1 macho 20.45841
## 2 hembra 21.17661
# 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 559.4451
## 2 Pacifico Central 623.9331
## 3 Pacifico Sur 501.7627
# 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.258205
## 2 hembra 3.590457
aggregate(Hg ~ sexo, data = db.ord, FUN = length) ## sexo Hg
## 1 macho 42
## 2 hembra 39
aggregate(Hg ~ region, data = db.ord, FUN = length) ## region Hg
## 1 Pacifico Norte 26
## 2 Pacifico Central 30
## 3 Pacifico Sur 25
# 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.17218 3.559481
## 2 Pacifico Central macho 20.60223 3.024847
## 3 Pacifico Sur macho 19.37952 3.284337
## 4 Pacifico Norte hembra 21.86206 3.799888
## 5 Pacifico Central hembra 21.09108 3.863185
## 6 Pacifico Sur hembra 20.61343 3.302684
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.2 20.6 19.4 21.9 21.1 ...
## $ sd : num 3.56 3.02 3.28 3.8 3.86 ...
# ¿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 Central macho 26.26359
## 2 Pacifico Norte macho 23.57614
## 3 Pacifico Central hembra 15.63967
## 4 Pacifico Norte macho 18.46391
## 5 Pacifico Sur hembra 22.72641
## 6 Pacifico Norte hembra 20.36726
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 Central macho 26.26359 73.32797
## 2 Pacifico Norte macho 23.57614 75.43251
## 3 Pacifico Central hembra 15.63967 71.36238
## 4 Pacifico Norte macho 18.46391 74.80218
## 5 Pacifico Sur hembra 22.72641 72.13311
## 6 Pacifico Norte hembra 20.36726 76.62701
# 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 20.82447 3.468673 0.7957681 74.45438 3.904919
## 2 Pacifico Central macho 20.92324 3.084093 0.9752758 72.95527 3.211648
## 3 Pacifico Sur macho 19.34513 2.798240 0.9327466 76.45041 5.087845
## 4 Pacifico Norte hembra 21.49916 3.325237 0.8585724 76.50690 2.915851
## 5 Pacifico Central hembra 19.31976 2.902228 0.9177652 74.67067 2.666235
## 6 Pacifico Sur hembra 20.59656 3.896344 0.9183770 75.94934 3.628046
## se.peso
## 1 0.8958498
## 2 1.0156123
## 3 1.6959482
## 4 0.7528695
## 5 0.8431375
## 6 0.8551387
Ejercicios
- Crear un
data.framellamadoDFque 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.
- Utilice la base de datos
DFpara 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 objetoDF1; (iii) seleccione todas las columnas de la base de datosDFcuyo país sea “D”, “E”, “F” y “J”; seleccione todas las columnas y filas correspondientes cuyo índice sea menor a 11.
- Utilice la base de datos
DFpara realizar seleccionar todas las regiones y países cuyo índice es mayor a 5 y peso menor a 42.5.
- Crear una nueva columna y agregarla a la base de datos
DFque 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 objetoresultsque 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 hembra 26.77666 81.97126
## 2 Pacifico Norte hembra 23.56570 79.75760
## 3 Pacifico Norte macho 27.30237 71.29735
## 4 Pacifico Norte hembra 24.50741 74.15354
## 5 Pacifico Sur macho 25.40966 77.35959
## 6 Pacifico Norte hembra 16.21811 80.81622
# Crear una lista
A <- list(db.new$region, db.new$sexo, db.new$Hg, db.new$peso)
A[[1]]## [1] Pacifico Sur Pacifico Norte Pacifico Norte Pacifico Norte
## [5] Pacifico Sur Pacifico Norte Pacifico Central Pacifico Sur
## [9] Pacifico Sur Pacifico Norte Pacifico Sur Pacifico Sur
## [13] Pacifico Norte Pacifico Central Pacifico Central Pacifico Central
## [17] Pacifico Sur Pacifico Sur Pacifico Norte Pacifico Sur
## [21] Pacifico Norte Pacifico Sur Pacifico Sur Pacifico Sur
## [25] Pacifico Central Pacifico Sur Pacifico Central Pacifico Norte
## [29] Pacifico Central Pacifico Central Pacifico Sur Pacifico Norte
## [33] Pacifico Sur Pacifico Sur Pacifico Sur Pacifico Norte
## [37] Pacifico Central Pacifico Norte Pacifico Norte Pacifico Sur
## [41] Pacifico Central Pacifico Sur Pacifico Central Pacifico Central
## [45] Pacifico Central Pacifico Sur Pacifico Sur Pacifico Sur
## [49] Pacifico Norte Pacifico Central Pacifico Norte Pacifico Norte
## [53] Pacifico Sur Pacifico Sur Pacifico Sur Pacifico Central
## [57] Pacifico Norte Pacifico Norte Pacifico Central Pacifico Sur
## [61] Pacifico Central Pacifico Norte Pacifico Norte Pacifico Central
## [65] Pacifico Central Pacifico Sur Pacifico Norte Pacifico Norte
## [69] Pacifico Sur Pacifico Central Pacifico Central Pacifico Central
## [73] Pacifico Norte Pacifico Central Pacifico Norte Pacifico Central
## [77] Pacifico Norte Pacifico Sur Pacifico Norte Pacifico Sur
## [81] Pacifico Sur
## Levels: Pacifico Norte Pacifico Central Pacifico Sur
A[[4]]## [1] 81.97126 79.75760 71.29735 74.15354 77.35959 80.81622 85.25288 75.93685
## [9] 74.70800 80.04911 74.42807 82.20211 75.69582 75.80330 80.40454 72.19007
## [17] 73.10232 78.76831 79.29124 76.75425 74.55222 70.19113 80.26487 63.70951
## [25] 71.55278 72.23503 78.88536 71.73532 74.82382 77.60850 78.24156 80.30210
## [33] 73.35508 79.06080 79.84246 78.02146 69.54348 75.44779 71.93006 83.98297
## [41] 74.76311 77.85935 72.94036 68.73182 78.56946 81.45312 71.41807 67.42294
## [49] 67.10108 74.80242 72.82732 69.36123 69.56974 72.94665 84.25393 72.46631
## [57] 84.11800 72.17646 72.82642 75.36941 81.62775 70.02756 79.95727 80.01353
## [65] 67.57453 77.46848 78.09198 71.54177 71.18321 78.69289 68.99708 78.72751
## [73] 77.12239 67.15160 67.02229 73.00927 79.06820 74.31121 75.89135 69.50079
## [81] 74.18834
# 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 22.65932 22.47776
## Pacifico Central 22.95347 22.42789
## Pacifico Sur 20.40879 21.98277
# 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.740195 3.837302
## Pacifico Central 4.669544 3.079029
## Pacifico Sur 3.784761 4.264667
# ¿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.67 3.43 0.95 13 74.30 3.39 0.94
## 2 Pacifico Norte hembra 22.10 4.28 1.29 11 75.91 4.11 1.24
## 3 Pacifico Central macho 23.49 3.51 1.01 12 74.51 3.58 1.03
## 4 Pacifico Central hembra 21.15 3.01 0.73 17 74.70 3.10 0.75
## 5 Pacifico Sur macho 22.14 3.83 1.16 11 75.00 4.97 1.50
## 6 Pacifico Sur hembra 20.81 2.71 0.66 17 74.84 3.39 0.82
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] 65.71601 87.80602
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 2 2 2 2 1 1 2 3 2 ...
## $ sexo : Factor w/ 2 levels "macho","hembra": 2 2 1 1 2 1 1 1 1 2 ...
## $ Hg : num 15.4 25.5 24 24.6 25.3 ...
## $ peso : num 75.5 73.1 74.9 72.8 75.6 ...
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] 65.7 87.8
range.peso[1]## [1] 65.71601
range.peso[2]## [1] 87.80602
# 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.selA 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
- Importe la base de datos
temp.co2.csvy realice un gráfico tipoboxploten donde la temperatura este en el ejexy el CO2 producido en el ejey. Nota: Debe tratar la temperatura como un factor con varios niveles.
R/ (no mirar…)
- Importe la base de datos
escuelas.csvy realice un gráfico tipoboxplotpara 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 colorespie(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")