Bibliotecas

  • La activación de las bibliotecas se hace con la función library
# Biblioteca para leer archivos de excel
library(readxl)

# Biblioteca para leer archivos csv
library(readr)

# Biblioteca para manejo y visualización de datos
library(tidyverse)

# Biblioteca para edición rápida de nombres de columnas
library(janitor)

Datos de excel

Importando datos

  • La lectura de archivos de excel la podemos realizar con la función read_excel
  • Siempre la función read_excel tomará la primera hoja del archivo de excel
arroz <- read_excel("datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx")

Consultando nombre de hojas

  • Consultando nombres:
excel_sheets("datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx")
## [1] "Costos"  "ejemplo"
  • Lectura de la hoja “Costos”:
arroz2 <- read_excel("datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx",
                     sheet = "Costos")
  • Lectura de la hoja “Ejemplo”:
otra_hoja <- read_excel("datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx",
                        sheet = "ejemplo")

Archivo en carpeta previa

  • Para indicar una carpeta o ruta previa usamos los dos puntos seguidos: ../
ejemplo <- read_excel("../prueba/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx")

Omitiendo filas

  • Podemos omitir filas al momento de leer los archivos de excel con el argumento “skip”:
arroz3 <- read_excel("datos/COSTOS POR HECTÁREA DE ARROZ, SISTEMA RIEGO, NACIONAL, I SEMESTRE.xlsx",
                     sheet = "Costos",
                     skip = 1)

arroz3

Datos CSV

  • read_csv(): para valores separados por comas (,)
  • read_csv2(): para valores separados por punto y comas (;)
datos_csv <- read_csv("datos/Superficie_Sembrada_con_Ra_ces_Bulbos_y_Tub_rculos_en_el_departamento_del_Valle_del_Cauca.csv")
  • ¿Qué ocurre si leo una base de datos separada por comas, con la función read_csv2?
datos_error <- read_csv2("datos/Superficie_Sembrada_con_Ra_ces_Bulbos_y_Tub_rculos_en_el_departamento_del_Valle_del_Cauca.csv")

Tipos de datos en R

  • Numérico (decimales):
    • numeric
    • double
  • Enteros:
    • integer
  • Texto sin orden (cualitativa nomimal):
    • character
  • Texto con orden (cualitativa ordinal)
    • factor
  • Fechas
    • POSIXct
    • Date
  • Booleanos o lógicos:
    • logical

Operador de tubería tidyverse

  • El operador de tubería es: %>%
  • Se puede obtener con Ctrl + Shift + M
  • Facilita el encadenamiento de procesos y hace más legible el código

Consultar tipos de datos

  • str: permite ver la estructura interna de una base de datos.
# Sin operador de tubería
str(otra_hoja)
## tibble [6 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Nombre: chr [1:6] "x1" "x2" "x3" "x4" ...
##  $ Edad  : num [1:6] 1 2 3 4 5 6
##  $ Peso  : num [1:6] 23.4 45.5 34.5 NA 50.5 80.9
##  $ Altura: num [1:6] 9 8 7 6 5 4
##  $ Fecha : POSIXct[1:6], format: "2023-01-01" "2023-01-15" ...
##  $ IMC   : chr [1:6] "2.56" "2.13" "2.15" NA ...
# Con operador de tubería
otra_hoja %>% 
  str()
## tibble [6 × 6] (S3: tbl_df/tbl/data.frame)
##  $ Nombre: chr [1:6] "x1" "x2" "x3" "x4" ...
##  $ Edad  : num [1:6] 1 2 3 4 5 6
##  $ Peso  : num [1:6] 23.4 45.5 34.5 NA 50.5 80.9
##  $ Altura: num [1:6] 9 8 7 6 5 4
##  $ Fecha : POSIXct[1:6], format: "2023-01-01" "2023-01-15" ...
##  $ IMC   : chr [1:6] "2.56" "2.13" "2.15" NA ...
  • Podemos usar la función class para validar el tipo de dato de una columna específica.
# Sin operador
class(otra_hoja$Nombre)
## [1] "character"
# Con operador
otra_hoja$Nombre %>% 
  class()
## [1] "character"

Datos lógicos o booleanos

  • Toman valores TRUE o FALSE
  • Son muy útiles para aplicar filtros sobre una base de datos
# Mayor
2 > 3
## [1] FALSE
# Mayor o igual
2 >= 3
## [1] FALSE
# Menor
2 < 3
## [1] TRUE
# Menor o igual
2 <= 3
## [1] TRUE
# Igualdad
10 == 10
## [1] TRUE
# Diferencia
10 != 10
## [1] FALSE
# Ejemplo con texto
"a" == "A"
## [1] FALSE
# Comparación en un vector
altura_plantas <- c(43.5, 50.2, 45.7, 31.0, 28.7)
altura_plantas > 30
## [1]  TRUE  TRUE  TRUE  TRUE FALSE

Filtros sobre una base de datos

  • Para aplicar filtros de filas en una base de datos usamos la fucnión filter (tidyverse).
otra_hoja %>% 
  filter(Nombre == "x2")
otra_hoja %>% 
  filter(Altura >= 6)
  • También es posible filtrar fechas:
otra_hoja %>% 
  filter(Fecha <= "2023-01-15")

Mínimo de una variable

  • Incorrecto:
otra_hoja$Peso %>% 
  min()
## [1] NA
  • Correcto:
otra_hoja$Peso %>% 
  min(na.rm = TRUE)
## [1] 23.4

Datos ordenados

  • Cada variable es una columna
  • Cada fila es una observación
  • Cada celda es un valor

Ejemplo1

Formato desordenado

ejemplo1 <- read_csv("datos/PRODUCCI_N_EN_TONELADAS_DE_CULTIVOS_DE_HORTALIZAS__EN_EL_VALLE_DEL_CAUCA.csv")

ejemplo1 %>% head()

Formato ordenado

ejemplo1_ordenado <-
  ejemplo1 %>%
  pivot_longer(
    cols = -c(Municipios, Año),
    names_to = "cultivo",
    values_to = "produccion"
  )

ejemplo1_ordenado %>% head()
  • Podemos regresar al formato ancho con la función pivot_wider:
ejemplo_ancho <-
  ejemplo1_ordenado %>% 
  pivot_wider(names_from = cultivo,
              values_from = produccion)

ejemplo_ancho %>% head()

Manipulación de datos

Procesos frecuentes


Datos EVAs

df_eva <- read_csv("datos/Evaluaciones_Agropecuarias_Municipales___EVA._2019_-_2021._Base_Agr_cola.csv") %>% 
  clean_names()

df_eva %>% head() 

Conteos

df_eva %>% 
  count(cultivo, sort = TRUE)
  • Puedo contar por más de un grupo o variable:
df_eva %>% 
  count(departamento, cultivo, sort = TRUE)

Filtro de filas

df_eva %>% 
  filter(cultivo == "Maíz")

Selección de columnas

df_eva %>% 
  select(departamento, municipio, cultivo, rendimiento)

Editar o crear columnas (mutar)

df_eva %>% 
  mutate(area_perdida = area_sembrada - area_cosechada)

filtrar + seleccionar + mutar

df_eva %>% 
  filter(cultivo == "Maíz") %>% 
  select(departamento, municipio, cultivo, area_sembrada, area_cosechada) %>% 
  mutate(area_perdida = area_sembrada - area_cosechada)

Agrupaciones y resumen

  • Podemos usar summarise() o reframe()
df_eva %>% 
  group_by(cultivo) %>% 
  reframe(total_area_siembra = sum(area_sembrada),
          promedio_rto = mean(rendimiento))