chunk
.La siguiente hoja de cálculo (lo que usualmente llamamos un ‘Excel’) contiene datos del cactus Melocactus intortus en el bosque Seco de Guánica.
Vamos a examinar sus componentes y estructura.
La estructura de los datos es la siguiente:
Las columnas pueden contener diferentes tipos de datos, como texto, números, fechas, etc., y podemos clasificarlas como:
estado
es una
variable categórica.altura
es una variable
numérica. Pueden ser enteros o decimales.FechaHora
es una
variable de tiempo.Vivo
es una
variable lógica.Tratamiento
es un factor._
)
en lugar de espacios y letras minúsculas.NA
(Not Available) o con un valor
específico, como -9999
, o dejar en blanco (pero hay que
estar seguro de que no haya un espacio).Tanto Excel como GoogleSheets permiten exportar los datos a un archivo csv. La ventaja de la exportación a csv es que es un formato de texto básico que se puede leer en cualquier programa de análisis de datos, como R, Python, etc. Además, es un formato que se puede editar directamente dentro de R Studio.
Los datos que se encuentran en un archivo csv no son accesibles directamente para análisis, primero deben ser cargados en R Studio en una estructura de datos llamada dataframe.
Para cargar los datos en R Studio, se puede usar la función
read.csv()
o read.csv2()
si el archivo csv
tiene el separador de decimales como coma.
Vamos a cargar los datos de Melocactus en R Studio.
# usaremos la función read.csv() para cargar los datos
melocactus <- read.csv("labecopob melocactus 20231008 - master.csv")
# ver las primeras filas de los datos
head(melocactus)
## grupo IDcactus azimut distancia altura long_inflo estado
## 1 1 1-1 327 10.36 45.5 3.5 E
## 2 1 1-2 327 10.36 7.2 NA S
## 3 1 1-3 327 11.20 8.3 NA S
## 4 1 1-4 319 11.20 7.5 NA S
## 5 1 1-5 319 11.20 NA NA X
## 6 1 1-6 317 9.50 NA NA X
str()
La función str()
nos permite ver la estructura de los
datos. Nos muestra el tipo de datos de cada columna y las primeras filas
de los datos.
str(melocactus)
## 'data.frame': 110 obs. of 7 variables:
## $ grupo : int 1 1 1 1 1 1 1 1 1 1 ...
## $ IDcactus : chr "1-1" "1-2" "1-3" "1-4" ...
## $ azimut : num 327 327 327 319 319 317 309 266 266 339 ...
## $ distancia : num 10.4 10.4 11.2 11.2 11.2 ...
## $ altura : num 45.5 7.2 8.3 7.5 NA NA NA NA NA 21.2 ...
## $ long_inflo: num 3.5 NA NA NA NA NA NA NA NA NA ...
## $ estado : chr "E" "S" "S" "S" ...
summary()
La función summary()
nos permite ver un resumen de los
datos numéricos.
summary(melocactus)
## grupo IDcactus azimut distancia
## Min. :1.000 Length:110 Min. : 25.0 Min. : 0.100
## 1st Qu.:1.000 Class :character 1st Qu.:114.8 1st Qu.: 9.275
## Median :2.000 Mode :character Median :239.5 Median :13.060
## Mean :1.609 Mean :211.2 Mean :13.651
## 3rd Qu.:2.000 3rd Qu.:307.2 3rd Qu.:20.310
## Max. :2.000 Max. :339.0 Max. :27.500
##
## altura long_inflo estado
## Min. : 0.500 Min. : 2.00 Length:110
## 1st Qu.: 2.500 1st Qu.: 5.20 Class :character
## Median : 4.400 Median :10.48 Mode :character
## Mean : 9.583 Mean :11.03
## 3rd Qu.: 9.650 3rd Qu.:17.20
## Max. :59.000 Max. :21.00
## NA's :32 NA's :101
table()
La función table()
nos permite ver la frecuencia de los
datos categóricos.
table(melocactus$estado)
##
## E S X
## 5 71 34
table()
con dos variablesLa función table()
también se puede usar con dos
variables para ver la frecuencia de las combinaciones de las
variables.
table(melocactus$estado, melocactus$grupo)
##
## 1 2
## E 4 1
## S 12 59
## X 27 7
dplyr
El paquete dplyr
es un paquete de manipulación de datos
que nos permite realizar operaciones comunes de forma sencilla y
eficiente.
Vamos a cargar el paquete dplyr
y a realizar algunas
operaciones con los datos de Melocactus. Si no lo tiene instalado puede
hacerlo manualmente mediante Packages -> Install -> dplyr.
# instalar el paquete dplyr
# install.packages("dplyr")
# cargar el paquete dplyr
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Podemos seleccionar solo las columnas de interés para trabajar con ellas.
# seleccionar solo las columnas de interés
melocactus_subset <- melocactus %>%
select(estado, altura)
head(melocactus_subset)
## estado altura
## 1 E 45.5
## 2 S 7.2
## 3 S 8.3
## 4 S 7.5
## 5 X NA
## 6 X NA
Podemos filtrar las filas de datos que cumplan con ciertas condiciones. Por ejemplo, podemos filtrar los datos para ver solo los individuos de Melocactus que están sanos.
# filtrar los datos
melocactus_sanos <- melocactus %>%
filter(estado == "S")
Vamos a usar la función mutate()
para crear una nueva
columna que represente la diferencia entre la altura y la longitud de la
inflorescencia.
# crear una nueva columna
melocactus_veg <- melocactus %>%
mutate(altura_veg = altura - long_inflo)
head(melocactus_veg)
## grupo IDcactus azimut distancia altura long_inflo estado altura_veg
## 1 1 1-1 327 10.36 45.5 3.5 E 42
## 2 1 1-2 327 10.36 7.2 NA S NA
## 3 1 1-3 327 11.20 8.3 NA S NA
## 4 1 1-4 319 11.20 7.5 NA S NA
## 5 1 1-5 319 11.20 NA NA X NA
## 6 1 1-6 317 9.50 NA NA X NA
Al tener NA en los datos, los operadores matemáticos no funcionan y producen NA como resultados. Vamos a hacer que los NA sean ceros.
# hacer que NA de altura y long_inflo sean ceros
melocactus_veg <- melocactus %>%
mutate(
altura = ifelse(is.na(altura), 0, altura),
long_inflo = ifelse(is.na(long_inflo), 0, long_inflo),
altura_veg = altura - long_inflo
)
head(melocactus_veg)
## grupo IDcactus azimut distancia altura long_inflo estado altura_veg
## 1 1 1-1 327 10.36 45.5 3.5 E 42.0
## 2 1 1-2 327 10.36 7.2 0.0 S 7.2
## 3 1 1-3 327 11.20 8.3 0.0 S 8.3
## 4 1 1-4 319 11.20 7.5 0.0 S 7.5
## 5 1 1-5 319 11.20 0.0 0.0 X 0.0
## 6 1 1-6 317 9.50 0.0 0.0 X 0.0
Podemos usar la función group_by()
para agrupar los
datos por una variable y luego usar la función summarise()
para resumir los datos. Vamos a agrupar los datos por el estado y
calcular la altura promedio.
# agrupar y resumir los datos
melocactus_resumen <- melocactus %>%
group_by(estado) %>%
summarise(altura_promedio = mean(altura, na.rm = TRUE))
melocactus_resumen
## # A tibble: 3 × 2
## estado altura_promedio
## <chr> <dbl>
## 1 E 37.4
## 2 S 7.39
## 3 X 18.0
Podemos usar la función arrange()
para ordenar los datos
por una columna específica. Vamos a ordenar los datos por la altura en
orden descendente.
# ordenar los datos
melocactus_ordenados <- melocactus %>%
arrange(desc(altura))
head(melocactus_ordenados)
## grupo IDcactus azimut distancia altura long_inflo estado
## 1 2 2-1 320 4.60 59.0 16.0 E
## 2 1 1-1 327 10.36 45.5 3.5 E
## 3 2 2-41 240 5.43 45.0 21.0 S
## 4 1 1-39 258 21.53 38.5 17.2 S
## 5 1 1-35 253 11.80 33.3 NA S
## 6 1 1-22 319 21.20 30.9 17.9 E
Una vez que hemos realizado las operaciones necesarias con los datos, podemos exportar los datos modificados a un archivo csv para su uso posterior.
# exportar los datos a un archivo csv
write.csv(melocactus_veg, "melocactus_veg.csv", row.names = FALSE)
La visualización de los datos es una parte importante del análisis de
datos. Vamos a usar la librería ggplot2
para crear un
gráfico de barras que muestre la altura promedio de los individuos de
Melocactus según su estado.
# cargar la librería ggplot2
library(ggplot2)
# crear un gráfico de barras
ggplot(melocactus_resumen, aes(x = estado, y = altura_promedio)) +
geom_bar(stat = "identity", fill = "skyblue") +
labs(
x = "Estado",
y = "Altura Promedio") +
theme_minimal()
Figura 1. Altura promedio de los individuos de Melocactus según su estado.
Vamos a crear un histograma que muestre la distribución de la altura de los individuos de Melocactus.
# crear un histograma
ggplot(melocactus, aes(x = altura)) +
geom_histogram(fill = "skyblue", color = "black", bins = 20) +
labs(
x = "Altura (cm",
y = "Frecuencia") +
theme_minimal()
## Warning: Removed 32 rows containing non-finite outside the scale range
## (`stat_bin()`).
Figura 2. Distribución de la altura de los individuos de Melocactus.
Vamos a crear una gráfica de dispersión que muestre la relación entre la altura y la longitud de la inflorescencia de los individuos de Melocactus.
# crear un diagrama de dispersión
ggplot(melocactus, aes(x = altura, y = long_inflo)) +
geom_point(color = "skyblue") +
labs(
x = "Altura (cm)",
y = "Longitud de la inflorescencia (cm)") +
theme_minimal()
## Warning: Removed 101 rows containing missing values or values outside the scale range
## (`geom_point()`).
Figura 3. Relación entre la altura y la longitud de la inflorescencia de los individuos de Melocactus.
Vamos a crear un gráfico de caja que muestre la distribución de la altura de los individuos de Melocactus según su estado.
# crear un gráfico de caja
ggplot(melocactus, aes(x = estado, y = altura, fill = estado)) +
geom_boxplot() +
labs(
x = "Estado",
y = "Altura (cm)") +
theme_minimal()
## Warning: Removed 32 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Figura 4. Distribución de la altura de los individuos de Melocactus según su estado.