Cada base de datos es un problema diferente, con diversas variables y objetivos, por eso debe ser abordada de manera distinta
Sin embargo, cuando se va a trabajar con cualquier base de datos es obligatorio realizar un análisis de la base, tanto analítica como gráficamente; incluso si son entregados en “bandeja de plata”, siempre debemos corroborar su estructura e investigar su calidad. Realizando este análisis previo podremos:
- Encontrar patrones.
- Identificar errores.
- Plantear nuevas hipótesis o preguntas.
- Identificar relaciones entre variables.
- Empezar a encontrar respuestas a nuestras preguntas de investigación.
En este análisis también podemos realizar procedimientos de creación o transformación de nuestras variables como la selección o filtrado de nuestras observaciones.
¡¡¡Atención, atención!!!
Debemos tener en cuenta que este análisis NO es un proceso formal con un conjunto estricto de reglas. Debes sentirte libre de investigar cada idea que se te ocurra. Algunas de estas ideas se desarrollarán y otras serán callejones sin salida.
En este post intentaremos darte herramientas que te permitirán analizar de una buena manera tus datos. Es importante considerar que este es un primer paso y no corresponde a un análisis estadístico riguroso, pero puede permitirte encontrar respuestas o guiarte en el tipo de análisis que quieres realizar.
Bien, entonces… ¡¡¡Empecemos a trabajar!!!
Primero, vamos a importar una base de datos llamada
disper <- read.csv(choose.files())
head(disper)
## sitio disp_1 disp_2 disp_3
## 1 P 32.00000 26.66667 10.00000
## 2 P 11.33333 16.66667 10.00000
## 3 P 40.66667 40.00000 33.33333
## 4 P 26.00000 15.00000 13.33333
## 5 P 29.33333 18.33333 0.00000
## 6 P 34.00000 30.00000 6.66667
Información general
Lo primero que haremos es digitar funciones que anteriormente habíamos utilizado en nuestros otros POSTS, tales como class() y str().
# Muestra la clase de nuestra base
class(disper)
## [1] "data.frame"
# Y de cada una de nuestras variables con la función lapply()
lapply(disper, class)
## $sitio
## [1] "character"
##
## $disp_1
## [1] "numeric"
##
## $disp_2
## [1] "numeric"
##
## $disp_3
## [1] "numeric"
# Muestra la estructura de la base
str(disper)
## 'data.frame': 81 obs. of 4 variables:
## $ sitio : chr "P" "P" "P" "P" ...
## $ disp_1: num 32 11.3 40.7 26 29.3 ...
## $ disp_2: num 26.7 16.7 40 15 18.3 ...
## $ disp_3: num 10 10 33.3 13.3 0 ...
Podemos observar que tenemos una base tipo
Exploración del contenido
Ahora vamos a conocer más acerca de nuestros datos, para ello utilizaremos una serie de funciones que nos permiten hacer un análisis previo.
# Este comando nos permite conocer las dimensiones de la base de datos
# Como recordarás son 81 observaciones para 4 variables
dim(disper)
## [1] 81 4
# head() por defecto mostrará los 6 primeros datos
# Ahora queremos que muestre los 10 primeros datos
head(disper,10)
## sitio disp_1 disp_2 disp_3
## 1 P 32.00000 26.66667 10.00000
## 2 P 11.33333 16.66667 10.00000
## 3 P 40.66667 40.00000 33.33333
## 4 P 26.00000 15.00000 13.33333
## 5 P 29.33333 18.33333 0.00000
## 6 P 34.00000 30.00000 6.66667
## 7 P 11.33333 10.00000 13.33333
## 8 P 20.00000 30.00000 23.33333
## 9 P 49.33333 45.00000 43.33333
## 10 BM 78.00000 58.33333 83.33333
# tail() por defecto mostrará los 6 últimos datos
# Ahora queremos que muestre los 10 últimos datos
tail(disper,10)
## sitio disp_1 disp_2 disp_3
## 72 BM3 32.66667 21.66667 23.33333
## 73 BS3 100.00000 100.00000 100.00000
## 74 BS3 93.33333 68.33333 83.33333
## 75 BS3 100.00000 100.00000 100.00000
## 76 BS3 100.00000 100.00000 100.00000
## 77 BS3 87.33333 68.33333 86.66667
## 78 BS3 78.66667 60.00000 63.33333
## 79 BS3 92.66667 76.66667 73.33333
## 80 BS3 83.33333 71.66667 50.00000
## 81 BS3 78.66667 80.00000 70.00000
Al igual podemos utilizar la función
unique(disper$sitio)
## [1] "P" "BM" "BS" "P2" "BM2" "BS2" "P3" "BM3" "BS3"
Como podemos observar el resultado generado son los valores únicos (“P”, “BM”, “BS”, “P2”, “BM2”, “BS2”, “P3”, “BM3”, “BS3”) para la variable “sitio”, los cuales fueron los sitios donde se tomaron los datos de dispersión.
Ten en cuenta que puedes ejecutar algunas de estas funciones en cualquier variable que desees, pero no siempre será necesario. Así que siempre pregúntate (en caso de que las utilices): ¿En que te va a ayudar en tu ejercicio? Así, no se volverá algo más que sabrás, y no será un tiro al aire que no te aportará nada.
Luego de obtener una información general de nuestro contenido, podemos realizar varias operaciones con nuestras variables, según las necesidades de nuestros proyectos; como te mencioné anteriormente, todo se puede realizar, pero no todo será necesario desarrollarlo, así que vamos a explorar un poco sobre ellas.
Operaciones con nuestras variables
A veces, la toma de datos no es suficiente para poder responder nuestras preguntas de investigación, por lo que las operaciones matemáticas suele ser un paso que muchos investigadores realizan. Por tanto, nosotros podemos realizar operaciones de suma, resta, potenciación, radicación, etc, etc, etc… ¡Veamos un ejemplo!
# Primero copiamos nuestra base a una nueva variable
oper <- disper
# En este ejemplo vamos a sobreescribir nuestros datos
# Sin embargo, NO te recomiendo que realices esto
oper$disp_1 <- oper$disp_1
# Mejor, te recomiendo crear una nueva variable y escribir los nuevos datos
oper$disp_4 <- oper$disp_2*2
head(oper)
## sitio disp_1 disp_2 disp_3 disp_4
## 1 P 32.00000 26.66667 10.00000 53.33334
## 2 P 11.33333 16.66667 10.00000 33.33334
## 3 P 40.66667 40.00000 33.33333 80.00000
## 4 P 26.00000 15.00000 13.33333 30.00000
## 5 P 29.33333 18.33333 0.00000 36.66666
## 6 P 34.00000 30.00000 6.66667 60.00000
Observa que hemos creado una nueva variable
Rondeo de números
Otra operación importante es el redondeo de números. Lo primero que tenemos que saber es que existen distintas maneras (matemáticamente hablando), de redondear o truncar un valor. Esto con el fin de tener los datos según necesitemos, en pocas palabras… “Depende de…” Típica frase de bióloga/o!
Round
Nos devuelve un valor numérico decimal redondeado a los dígitos que le digamos. Es lo que podríamos llamar el redondeo clásico.
disperound <- disper
# Redondearemos a 2 cifras decimales nuestra variable disper_1
disperound$disp_1 <- round(disperound$disp_1, 2)
# Redondearemos a 1 cifra decimal nuestra variable disper_2
disperound$disp_2 <- round(disperound$disp_2, 1)
# Redondearemos a 0 cifras decimales nuestra variable disper_3
disperound$disp_3 <- round(disperound$disp_3, 0)
head(disperound)
## sitio disp_1 disp_2 disp_3
## 1 P 32.00 26.7 10
## 2 P 11.33 16.7 10
## 3 P 40.67 40.0 33
## 4 P 26.00 15.0 13
## 5 P 29.33 18.3 0
## 6 P 34.00 30.0 7
Ceiling
Nos devuelve el próximo valor entero del número elegido. Siempre devuelve el entero posterior, excepto cuando sea exacto (es decir, salta al próximo número entero desde el primer decimal).
dispercei <- disper
dispercei$disp_1 <- ceiling(dispercei$disp_1)
head(dispercei)
## sitio disp_1 disp_2 disp_3
## 1 P 32 26.66667 10.00000
## 2 P 12 16.66667 10.00000
## 3 P 41 40.00000 33.33333
## 4 P 26 15.00000 13.33333
## 5 P 30 18.33333 0.00000
## 6 P 34 30.00000 6.66667
Trunc / Floor
Esto es básicamente lo que conocemos matemáticamente como truncar un valor. Es decir, deja literalmente el número entero.
dispertrunc <- disper
disperfloor <- disper
dispertrunc$disp_1 <- trunc(dispertrunc$disp_1)
head(dispertrunc)
## sitio disp_1 disp_2 disp_3
## 1 P 32 26.66667 10.00000
## 2 P 11 16.66667 10.00000
## 3 P 40 40.00000 33.33333
## 4 P 26 15.00000 13.33333
## 5 P 29 18.33333 0.00000
## 6 P 34 30.00000 6.66667
disperfloor$disp_1 <- floor(disperfloor$disp_1)
head(disperfloor)
## sitio disp_1 disp_2 disp_3
## 1 P 32 26.66667 10.00000
## 2 P 11 16.66667 10.00000
## 3 P 40 40.00000 33.33333
## 4 P 26 15.00000 13.33333
## 5 P 29 18.33333 0.00000
## 6 P 34 30.00000 6.66667
Otras modificaciones
Luego de modificar nuestros datos podemos realizar unas pequeñas modificaciones para no perdernos en nuestros propios pensamientos y datos, primero los nombres, este cambio lo podemos realizar con la función
dispername <- disper
# Con esta función sabremos los nombres de nuestra variables
names(dispername)
## [1] "sitio" "disp_1" "disp_2" "disp_3"
# Y podemos modificarlos según lo que necesitemos
dispername <- rename(dispername, Lugares = sitio, Salida1 = disp_1,
Salida2 = disp_2, Salida3 = disp_3)
names(dispername)
## [1] "Lugares" "Salida1" "Salida2" "Salida3"
Finalizado el análisis y modificación de nuestros datos, según nuestras necesidades, vamos a proceder a realizar una breve descripción estadística de estos datos, con el fin de describir los datos de una manera cuantitativa y tener una idea de lo que podemos o no podemos hacer con ellos.
Estadística descriptiva
Para realizar un análisis de estadística descriptiva hay múltiples funciones, en este post abarcaremos las principales.
¡¡¡Atención, atención!!!
Si no tienes claros conceptos básicos de la estadística te invitamos a que leas un poco sobre ellos, ¡la idea es que no te enloquezcas leyendo este post!
# Muestra el valor mínimo existente en el vector
# na.rm = TRUE - Si hay presentes NAs mostrará el valor mínimo numérico
# na.rm = FALSE - Si hay presentes NAs mostrará NA
min(disper$disp_1, na.rm = TRUE)
## [1] 11.33333
# Valor máximo
max(disper$disp_1, na.rm = TRUE)
## [1] 100
# Valor mínimo y máximo
range(disper$disp_1, na.rm = TRUE)
## [1] 11.33333 100.00000
# Valor de la media
mean(disper$disp_1, na.rm = TRUE)
## [1] 61.1358
# Valor de la varianza
var(disper$disp_1, na.rm = TRUE)
## [1] 817.0605
# Valor de la desviación estándar
sd(disper$disp_1, na.rm = TRUE)
## [1] 28.58427
# Valor de la mediana
median(disper$disp_1, na.rm = TRUE)
## [1] 71.33333
# Valores de quantiles
quantile(disper$disp_1, na.rm = TRUE)
## 0% 25% 50% 75% 100%
## 11.33333 32.66667 71.33333 83.33333 100.00000
Ahora utilizaremos la función
summary(disper)
## sitio disp_1 disp_2 disp_3
## Length:81 Min. : 11.33 Min. : 10.00 Min. : 0.00
## Class :character 1st Qu.: 32.67 1st Qu.: 30.00 1st Qu.: 23.33
## Mode :character Median : 71.33 Median : 58.33 Median : 50.00
## Mean : 61.14 Mean : 54.75 Mean : 52.96
## 3rd Qu.: 83.33 3rd Qu.: 76.67 3rd Qu.: 83.33
## Max. :100.00 Max. :100.00 Max. :100.00
Aunque usando todas las funciones antes descritas, podemos explorar el contenido de cualquier base de datos y obtener una visión general sobre su estructura, esta es una tarea que puede simplificarse enormemente gracias a funciones como
Esta función nos mostrará un resumen de cada una de las variables de nuestra base de datos, en la cual podemos ver valores de máximos, mínimos, medias, valores únicos, proporciones de estos valores, entre otros, tal y como observamos en el siguiente ejemplo:
library(Hmisc)
describe(disper)
## disper
##
## 4 Variables 81 Observations
## --------------------------------------------------------------------------------
## sitio
## n missing distinct
## 81 0 9
##
## lowest : BM BM2 BM3 BS BS2, highest: BS2 BS3 P P2 P3
##
## Value BM BM2 BM3 BS BS2 BS3 P P2 P3
## Frequency 9 9 9 9 9 9 9 9 9
## Proportion 0.111 0.111 0.111 0.111 0.111 0.111 0.111 0.111 0.111
## --------------------------------------------------------------------------------
## disp_1
## n missing distinct Info Mean Gmd .05 .10
## 81 0 22 0.997 61.14 32.75 11.33 20.00
## .25 .50 .75 .90 .95
## 32.67 71.33 83.33 100.00 100.00
##
## lowest : 11.33333 20.00000 26.00000 29.33333 32.00000
## highest: 83.33333 87.33333 92.66667 93.33333 100.00000
## --------------------------------------------------------------------------------
## disp_2
## n missing distinct Info Mean Gmd .05 .10
## 81 0 21 0.996 54.75 31.84 15.00 16.67
## .25 .50 .75 .90 .95
## 30.00 58.33 76.67 100.00 100.00
##
## lowest : 10.00000 15.00000 16.66667 18.33333 21.66667
## highest: 76.66667 80.00000 83.33333 86.66667 100.00000
## --------------------------------------------------------------------------------
## disp_3
## n missing distinct Info Mean Gmd .05 .10
## 81 0 16 0.993 52.96 36.74 6.667 10.000
## .25 .50 .75 .90 .95
## 23.333 50.000 83.333 100.000 100.000
##
## lowest : 0.00000 6.66667 10.00000 13.33333 23.33333
## highest: 73.33333 76.66667 83.33333 86.66667 100.00000
##
## 0 (3, 0.037), 6.66667 (3, 0.037), 10 (6, 0.074), 13.33333 (6, 0.074), 23.33333
## (6, 0.074), 33.33333 (3, 0.037), 43.33333 (6, 0.074), 46.66667 (6, 0.074), 50
## (3, 0.037), 63.33333 (6, 0.074), 70 (3, 0.037), 73.33333 (3, 0.037), 76.66667
## (3, 0.037), 83.33333 (12, 0.148), 86.66667 (3, 0.037), 100 (9, 0.111)
## --------------------------------------------------------------------------------
Bien, ya conociendo un poco de un análisis estadístico previo de nuestras variables y conociendo como se comportan y que naturaleza tienen, vamos a conocer otras funciones muy especiales que serán fundamentales para tratar nuestros datos; funciones que nos permitirán realizar modificaciones pertinentes y dejar nuestros datos listos.
Verbos dplyr
El paquete
# Recuerda siempre cargar tus paquetes para trabajar con ellos
library(dplyr)
Entre ellas encontramos las siguientes:
select() elige variables basadas en sus nombres.filter() elige los casos en función de sus valores.arrange() cambia el orden de las filas.mutate agrega nuevas variables que son funciones de variables existentes.group_by() agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen.
Todos los verbos funcionan de manera similar:
- El primer argumento es un marco de datos.
- Los siguientes argumentos describen qué hacer con el marco de datos, utilizando los nombres de las variables (sin comillas).
- El resultado es un nuevo marco de datos.
Estas funciones juntas, facilitan la encadenación de varios pasos sencillos para lograr un resultado complejo. Profundicemos y veamos cómo funcionan estos verbos.
select()
Cuando tenemos muchas variables en nuestra base de datos, pero solo necesitamos trabajar con un subconjunto de ellas, podemos seleccionar un subconjunto de variables de nuestra base de datos a través del uso de la función
## Tenemos dos formas
# La primera es elegir las variables que necesitamos
selec <- select(disper, sitio, disp_3)
head(selec)
## sitio disp_3
## 1 P 10.00000
## 2 P 10.00000
## 3 P 33.33333
## 4 P 13.33333
## 5 P 0.00000
## 6 P 6.66667
# La segunda es especificar las variables que NO necesitamos
selec2 <- select(disper, -(disp_1))
head(selec2)
## sitio disp_2 disp_3
## 1 P 26.66667 10.00000
## 2 P 16.66667 10.00000
## 3 P 40.00000 33.33333
## 4 P 15.00000 13.33333
## 5 P 18.33333 0.00000
## 6 P 30.00000 6.66667
Como ves, ahora sólo tendremos las variables con la cual podremos trabajar de manera más sencilla, sin todos esos demás datos.
filter()
El filtrado se utiliza con el fin de seleccionar un subconjunto del data.frame que contiene nuestros datos. El uso básico del filtro se hace mediante la función
Para usar el filtrado de manera efectiva, se debe saber cómo seleccionar las observaciones que se desean, utilizando los operadores de comparación. R proporciona el paquete estándar:
Acá te presentamos un pequeño gráfico del funcionamiento de los operadores
Ahora, veamos un ejemplo de filtrado con nuestra base.
# Filtramos para tener únicamente los valores del sitio "P"
filt1 <- filter(disper, sitio == "P")
unique(filt1$sitio)
## [1] "P"
# Filtramos los datos menores a 50 en "disp_1"
filt2 <- filter(disper, disp_1 < 50)
summary(filt2$disp_1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 11.33 20.00 32.00 30.55 40.67 49.33
# Al igual podemos guardar el filtrado en una nueva variable
# Con dos términos de filtrado
filt3 <- filter(disper, disp_3 < 75, sitio != "P")
summary(filt3$disp_1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 11.33 32.00 49.33 51.42 78.67 92.67
unique(filt3$sitio)
## [1] "BM" "BS" "P2" "BM2" "BS2" "P3" "BM3" "BS3"
Así, podemos ver que se realizó nuestro filtrado correctamente y nuestra nueva variable tiene 24 observaciones para 4 variables.
arrange()
Otro proceso muy habitual es reordenar las filas de nuestros datos. Esto se usa cuando queremos inspeccionar un conjunto de datos para buscar asociaciones entre las diferentes variables, lo que resulta difícil de hacer si no están ordenados. Para realizar la ordenación se utiliza la función
# Ordenaremos de mayor a menor cada una de las variables
ord <- arrange(disper, sitio, disp_1, disp_2, disp_3)
# Ordenaremos de menor a mayor únicamente la variable disp_2
ord2 <- arrange(disper, desc(disp_2))
mutate()
En la creación de variables a partir de las originales de nuestros datos tenemos dos opciones:
- Crear una nueva variable sin eliminar las variables originales
- Crear una nueva variable eliminando las variables originales.
Así para nuestra primera opción (NO eliminar nuestras variables originales), usamos la función
# Primero seleccionamos las variables que queremos trabajar
sel <- select(disper, disp_1, disp_2, disp_3)
mut <- mutate(sel, prom = ((disp_1 + disp_2 + disp_3)/3))
head(mut)
## disp_1 disp_2 disp_3 prom
## 1 32.00000 26.66667 10.00000 22.88889
## 2 11.33333 16.66667 10.00000 12.66667
## 3 40.66667 40.00000 33.33333 38.00000
## 4 26.00000 15.00000 13.33333 18.11111
## 5 29.33333 18.33333 0.00000 15.88889
## 6 34.00000 30.00000 6.66667 23.55556
Y listo, tenemos nuestra nueva variable (prom), la cual es un promedio de las tres variables de dispersión.
Sin embargo, para nuestra segunda opción (eliminar nuestras variables originales), usamos la función
sel <- select(disper, disp_1, disp_2, disp_3)
tmut <- transmute(sel, prom = ((disp_1 + disp_2 + disp_3)/3))
head(tmut)
## prom
## 1 22.88889
## 2 12.66667
## 3 38.00000
## 4 18.11111
## 5 15.88889
## 6 23.55556
group_by()
La función
ejemgroup <- group_by(disper, sitio)
ejemgroup
## # A tibble: 81 x 4
## # Groups: sitio [9]
## sitio disp_1 disp_2 disp_3
## <chr> <dbl> <dbl> <dbl>
## 1 P 32 26.7 10
## 2 P 11.3 16.7 10
## 3 P 40.7 40 33.3
## 4 P 26 15 13.3
## 5 P 29.3 18.3 0
## 6 P 34 30 6.67
## 7 P 11.3 10 13.3
## 8 P 20 30 23.3
## 9 P 49.3 45 43.3
## 10 BM 78 58.3 83.3
## # ... with 71 more rows
Pero, la función
summarise(ejemgroup, mean(disp_1), min(disp_2), min(disp_3))
## # A tibble: 9 x 4
## sitio `mean(disp_1)` `min(disp_2)` `min(disp_3)`
## <chr> <dbl> <dbl> <dbl>
## 1 BM 64.7 21.7 23.3
## 2 BM2 64.7 21.7 23.3
## 3 BM3 64.7 21.7 23.3
## 4 BS 90.4 60 50
## 5 BS2 90.4 60 50
## 6 BS3 90.4 60 50
## 7 P 28.2 10 0
## 8 P2 28.2 10 0
## 9 P3 28.2 10 0
Como vemos, en las variables utilizamos funciones estadísticas como la media, mínimo y máximo. Siéntete libre de elegir las que creas pertinentes y respondan a tus preguntas. Ten presente que esto solo es un acercamiento a todo lo que podemos llegar a realizar, hay muuuuuuchas funciones y operaciones por hacer. Por ejemplo, una de ellas es la utilización de los pipeline, ¿Qué es? ¡Veamoslo a continuación!
Combinando operaciones con pipeline (%>%)
El operador pipeline %>% es útil para concatenar/unir múltiples operaciones
Este operador nos permite escribir una secuencia de operaciones de izquierda a derecha, como vemos a continuación:
¡¡¡Atención, atención!!!
El atajo de teclado para el operador %>% es
# Se puede realizar esta operación de la manera tradicional
ejem1 <- select(disper, disp_1, disp_2)
head(ejem1)
## disp_1 disp_2
## 1 32.00000 26.66667
## 2 11.33333 16.66667
## 3 40.66667 40.00000
## 4 26.00000 15.00000
## 5 29.33333 18.33333
## 6 34.00000 30.00000
# Utilizando pipeline obtenemos el mismo resultado
ejempipe <- disper %>% select(disp_1, disp_2)
head(ejempipe)
## disp_1 disp_2
## 1 32.00000 26.66667
## 2 11.33333 16.66667
## 3 40.66667 40.00000
## 4 26.00000 15.00000
## 5 29.33333 18.33333
## 6 34.00000 30.00000
Esto quiere decir que el primer paso es llamar a la base de datos que consideremos y luego agregamos las funciones que necesitemos mediante el pipeline! Si, todas las que nos imaginemos, mira como queda este código:
ejempipe2 <- disper %>%
select(disp_1, disp_2)%>%
filter(disp_1<20)%>%
arrange(disp_2)%>%
mutate(promedio = ((disp_1 + disp_2)/2))
ejempipe2
## disp_1 disp_2 promedio
## 1 11.33333 10.00000 10.66667
## 2 11.33333 10.00000 10.66667
## 3 11.33333 10.00000 10.66667
## 4 11.33333 16.66667 14.00000
## 5 11.33333 16.66667 14.00000
## 6 11.33333 16.66667 14.00000
Así, obtenemos un conjunto de datos completo con los elementos que ingresamos con alguno de los verbos
¡¡¡Pa’ finalizar!!!
Como ves, no es una receta, hay múltiples caminos y cada uno de puede acercar o alejar de tu objetivo. En este punto, es útil considerar algunas preguntas para que comprendas que andas haciendo.
¿Tienes los datos correctos?, ¿Tienes la pregunta correcta?, ¿Necesitas otros datos?
¡Siempre pregúntate que andas haciendo y si ese camino te lleva hacía donde quieres ir! (Aplica para la vida con condiciones y restricciones, lee la letra pequeña).
Es importante ya que puedes simplemente estar haciendo cosas que no tendrán ningún sentido y únicamente perderás tiempo y neuronas. Agárrala suave, respira y revisa en donde estás parado y si eso responde tu pregunta; sino, agarra tu maleta, devúelvete y empieza de nuevo. ¡La vida misma se trata de ello!
¡NUNCA ES TARDE PARA EMPEZAR!
Muchas gracias por leernos y esperamos que hayas aprendido o recordado algo más sobre el mundo de R. Nos vemos en la segunda parte de este post, en la cual ya empezaremos a ver algunos gráficos básicos!!
Bibliografía