1. Introducción a R para Gestión Digital de Sistemas Agropecuarios

Bases de R + Introducción a dplyr y tidyr

# Ayuda en R
?mean
x <- c(0:10, 50)
x
##  [1]  0  1  2  3  4  5  6  7  8  9 10 50
round(mean(x),1)
## [1] 8.8
?sd
round(sd(1:10) ^ 2, 2)
## [1] 9.17

2. Vectores: Datos Agroindustriales Básicos

Ejemplo con sólidos solubles o grados brix en pulpa de guayaba

Vector numérico

brix <- c(10.2, 11.5, 10.8, 12.1, 11.7)

# Imprimir brix
brix
## [1] 10.2 11.5 10.8 12.1 11.7
# Clase de vector de brix
class(brix) #como es numérico puedo hacer operaciones matemáticas
## [1] "numeric"
# brix promedio
mean(brix)
## [1] 11.26
# mediana
median(brix)
## [1] 11.5
# máximo
max(brix)
## [1] 12.1
# mínimo
min(brix)
## [1] 10.2

Vector character

humedad <- c(78.5, 80.1, 79.4, NA, 81)
class(humedad)
## [1] "numeric"
humedad_caracter <- c(78.5, 80.1, 79.4, NA, 81, "90")
class(humedad_caracter)
## [1] "character"

3. Operaciones básicas

peso_producto <- c(1.2, 1.5, 1.3, 1.4, 1.6) #kg
fraccion_util <- c(0.68, 0.72, 0.70, 0.69, 0.71)
pulpa_util <- peso_producto * fraccion_util
pulpa_util
## [1] 0.816 1.080 0.910 0.966 1.136
mean(pulpa_util)
## [1] 0.9816

4. Vectores de texto y factores

producto <- c("Mango", "Guayaba", "Guayaba", "Mango")
producto
## [1] "Mango"   "Guayaba" "Guayaba" "Mango"
class(producto)
## [1] "character"

Convertir a factor el caracter anterior

#Convertir a fctor
producto_f <- factor(producto)
class(producto_f)
## [1] "factor"
levels(producto_f)
## [1] "Guayaba" "Mango"
table(producto_f)
## producto_f
## Guayaba   Mango 
##       2       2
# Temperaturas de secado
tratamiento <- c("60C", "70C", "80C", "60C", "90C", "105C")
tratamiento_f <- factor(tratamiento)

#Promedio
mean(tratamiento_f) #Arroja error porque es un factor
## Warning in mean.default(tratamiento_f): argument is not numeric or logical:
## returning NA
## [1] NA
# Niveles de tratamiento
levels(tratamiento_f)
## [1] "105C" "60C"  "70C"  "80C"  "90C"
#Tabla de frecuencias
table(tratamiento_f)
## tratamiento_f
## 105C  60C  70C  80C  90C 
##    1    2    1    1    1

5. Indexación: Acceder a datos

pH <- c(3.8, 4.1, 3.6, 4.3, 3.9)

pH[1] #Primer valor
## [1] 3.8
pH[4] #Cuarto valor
## [1] 4.3
pH[-1] #Todos excepto primer valor
## [1] 4.1 3.6 4.3 3.9
pH[pH > 3.8] #Valores mayores a 3.8
## [1] 4.1 4.3 3.9
pH[pH != 3.6] #Valores distintos a 3.6
## [1] 3.8 4.1 4.3 3.9

6. Crear secuencias

temperatura <- seq(from = 40, to = 100, by = 10)
#Ploteo de temperatura al cuadrado
plot(temperatura^2, 
     ylab = "Temperatura °C",
     xlab = "Muestras",
     main = "Temperatura de muestras de harinas")

7. Crear un Data Frame

}

datos <- data.frame(
  muestra = 1:8,
  producto = c("Mango", "Mango", "Guayaba", "Guayaba",
               "Mango", "Guayaba", "Mango", "Guayaba"),
  tratamiento = c("Control", "Secado", "Control", "Secado",
                  "Control", "Secado", "Secado", "Control"),
  brix = c(12.1, 13.4, 10.5, 11.8, 12.7, 11.1, 13.0, 10.8),
  ph = c(4.2, 4.0, 3.7, 3.8, 4.1, 3.9, 4.0, 3.8),
  humedad = c(82.3, 18.5, 79.8, 20.1, 81.0, 19.3, 17.8, 80.4)
)

datos
##   muestra producto tratamiento brix  ph humedad
## 1       1    Mango     Control 12.1 4.2    82.3
## 2       2    Mango      Secado 13.4 4.0    18.5
## 3       3  Guayaba     Control 10.5 3.7    79.8
## 4       4  Guayaba      Secado 11.8 3.8    20.1
## 5       5    Mango     Control 12.7 4.1    81.0
## 6       6  Guayaba      Secado 11.1 3.9    19.3
## 7       7    Mango      Secado 13.0 4.0    17.8
## 8       8  Guayaba     Control 10.8 3.8    80.4
class(datos)
## [1] "data.frame"
# Estructura del data frame
str(datos)
## 'data.frame':    8 obs. of  6 variables:
##  $ muestra    : int  1 2 3 4 5 6 7 8
##  $ producto   : chr  "Mango" "Mango" "Guayaba" "Guayaba" ...
##  $ tratamiento: chr  "Control" "Secado" "Control" "Secado" ...
##  $ brix       : num  12.1 13.4 10.5 11.8 12.7 11.1 13 10.8
##  $ ph         : num  4.2 4 3.7 3.8 4.1 3.9 4 3.8
##  $ humedad    : num  82.3 18.5 79.8 20.1 81 19.3 17.8 80.4
# Ver nombres de variables
names(datos)
## [1] "muestra"     "producto"    "tratamiento" "brix"        "ph"         
## [6] "humedad"
#Resumen general
summary(datos)
##     muestra       producto         tratamiento             brix      
##  Min.   :1.00   Length:8           Length:8           Min.   :10.50  
##  1st Qu.:2.75   Class :character   Class :character   1st Qu.:11.03  
##  Median :4.50   Mode  :character   Mode  :character   Median :11.95  
##  Mean   :4.50                                         Mean   :11.93  
##  3rd Qu.:6.25                                         3rd Qu.:12.78  
##  Max.   :8.00                                         Max.   :13.40  
##        ph           humedad     
##  Min.   :3.700   Min.   :17.80  
##  1st Qu.:3.800   1st Qu.:19.10  
##  Median :3.950   Median :49.95  
##  Mean   :3.938   Mean   :49.90  
##  3rd Qu.:4.025   3rd Qu.:80.55  
##  Max.   :4.200   Max.   :82.30
#Guardar data set datos
write.csv(datos, "data/datos_frutas.csv", row.names = F)

8. Exploración del Data Set

class(datos)
## [1] "data.frame"
#Acceder a una columna
datos$brix
## [1] 12.1 13.4 10.5 11.8 12.7 11.1 13.0 10.8
datos$ph
## [1] 4.2 4.0 3.7 3.8 4.1 3.9 4.0 3.8
names(datos)
## [1] "muestra"     "producto"    "tratamiento" "brix"        "ph"         
## [6] "humedad"
#Promedio de °Brix
mean(datos$brix)
## [1] 11.925
#Promedio de humedad
mean(datos$humedad)
## [1] 49.9
#Tabla de frecuencias para productos
table(datos$producto)
## 
## Guayaba   Mango 
##       4       4
#Tabla de frecuencias para tratamiento
table(datos$tratamiento)
## 
## Control  Secado 
##       4       4

9. Gráficos Básicos en R

# Histograma de humedad
hist(datos$humedad,
     main = "Distribución de humedad",
     xlab = "Humedad (%)",
     col = "lightblue")

# Boxplott de °Brix por producto
boxplot(brix ~ producto, data = datos,
        main = "°Brix por tipo de producto",
        xlab = "Producto",
        ylab = "°Brix",
        col = "#27F538")

# Boxplot de humedad por tratamiento
boxplot(humedad ~ tratamiento, data = datos,
        main = "Humedad según tratamiento",
        xlab = "Tratamiento",
        ylab = "Humedad (%)",
        col = "lightgray")

10. Introducción a dplyr

# Instalar si es necesario:
# install.packages("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
# Ver primeras filas
datos %>% head()
##   muestra producto tratamiento brix  ph humedad
## 1       1    Mango     Control 12.1 4.2    82.3
## 2       2    Mango      Secado 13.4 4.0    18.5
## 3       3  Guayaba     Control 10.5 3.7    79.8
## 4       4  Guayaba      Secado 11.8 3.8    20.1
## 5       5    Mango     Control 12.7 4.1    81.0
## 6       6  Guayaba      Secado 11.1 3.9    19.3
# Seleccionar columnas
datos %>%
  select(producto, tratamiento, brix)
##   producto tratamiento brix
## 1    Mango     Control 12.1
## 2    Mango      Secado 13.4
## 3  Guayaba     Control 10.5
## 4  Guayaba      Secado 11.8
## 5    Mango     Control 12.7
## 6  Guayaba      Secado 11.1
## 7    Mango      Secado 13.0
## 8  Guayaba     Control 10.8
# Filtrar muestras de mango
datos %>%
  filter(producto == "Mango")
##   muestra producto tratamiento brix  ph humedad
## 1       1    Mango     Control 12.1 4.2    82.3
## 2       2    Mango      Secado 13.4 4.0    18.5
## 3       5    Mango     Control 12.7 4.1    81.0
## 4       7    Mango      Secado 13.0 4.0    17.8
# Filtrar muestras con humedad menor a 30%
datos %>%
  mutate(humedad < 30)
##   muestra producto tratamiento brix  ph humedad humedad < 30
## 1       1    Mango     Control 12.1 4.2    82.3        FALSE
## 2       2    Mango      Secado 13.4 4.0    18.5         TRUE
## 3       3  Guayaba     Control 10.5 3.7    79.8        FALSE
## 4       4  Guayaba      Secado 11.8 3.8    20.1         TRUE
## 5       5    Mango     Control 12.7 4.1    81.0        FALSE
## 6       6  Guayaba      Secado 11.1 3.9    19.3         TRUE
## 7       7    Mango      Secado 13.0 4.0    17.8         TRUE
## 8       8  Guayaba     Control 10.8 3.8    80.4        FALSE
# Crear nueva variable: relación Brix/pH
datos %>%
  mutate(indice_calidad = brix / ph)
##   muestra producto tratamiento brix  ph humedad indice_calidad
## 1       1    Mango     Control 12.1 4.2    82.3       2.880952
## 2       2    Mango      Secado 13.4 4.0    18.5       3.350000
## 3       3  Guayaba     Control 10.5 3.7    79.8       2.837838
## 4       4  Guayaba      Secado 11.8 3.8    20.1       3.105263
## 5       5    Mango     Control 12.7 4.1    81.0       3.097561
## 6       6  Guayaba      Secado 11.1 3.9    19.3       2.846154
## 7       7    Mango      Secado 13.0 4.0    17.8       3.250000
## 8       8  Guayaba     Control 10.8 3.8    80.4       2.842105
# Ordenar de mayor a menor °Brix
datos %>%
  arrange(desc(brix))
##   muestra producto tratamiento brix  ph humedad
## 1       2    Mango      Secado 13.4 4.0    18.5
## 2       7    Mango      Secado 13.0 4.0    17.8
## 3       5    Mango     Control 12.7 4.1    81.0
## 4       1    Mango     Control 12.1 4.2    82.3
## 5       4  Guayaba      Secado 11.8 3.8    20.1
## 6       6  Guayaba      Secado 11.1 3.9    19.3
## 7       8  Guayaba     Control 10.8 3.8    80.4
## 8       3  Guayaba     Control 10.5 3.7    79.8
#Resumen por producto
datos %>%
  group_by(producto) %>%
  summarise(
    brix_prom = mean(brix),
    ph_prom = mean(ph),
    humedad_prom = mean(humedad)
  )
## # A tibble: 2 × 4
##   producto brix_prom ph_prom humedad_prom
##   <chr>        <dbl>   <dbl>        <dbl>
## 1 Guayaba       11.0    3.8          49.9
## 2 Mango         12.8    4.08         49.9
# Resumen por tratamiento
datos %>%
  group_by(tratamiento) %>%
  summarise(
    brix_prom = mean(brix),
    humedad_prom = mean(humedad)
  )
## # A tibble: 2 × 3
##   tratamiento brix_prom humedad_prom
##   <chr>           <dbl>        <dbl>
## 1 Control          11.5         80.9
## 2 Secado           12.3         18.9
# Resumen por producto y tratamiento
datos %>%
  group_by(producto, tratamiento) %>%
  summarise(
    n = n(),
    brix_prom = mean(brix),
    humedad_prom = mean(humedad),
    .groups = "drop"
  )
## # A tibble: 4 × 5
##   producto tratamiento     n brix_prom humedad_prom
##   <chr>    <chr>       <int>     <dbl>        <dbl>
## 1 Guayaba  Control         2      10.6         80.1
## 2 Guayaba  Secado          2      11.4         19.7
## 3 Mango    Control         2      12.4         81.6
## 4 Mango    Secado          2      13.2         18.2

11. Introducción a tidyr

# Instalar si es necesario:
# install.packages("tidyr")

library(tidyr)

# Crear una tabla en formato ancho
datos_ancho <- data.frame(
  muestra = 1:4,
  brix_inicial = c(10.5, 11.2, 12.1, 10.9),
  brix_final = c(12.8, 13.0, 14.2, 12.5),
  ph_inicial = c(4.3, 4.1, 4.0, 4.2),
  ph_final = c(3.9, 3.8, 3.7, 3.8)
)

datos_ancho
##   muestra brix_inicial brix_final ph_inicial ph_final
## 1       1         10.5       12.8        4.3      3.9
## 2       2         11.2       13.0        4.1      3.8
## 3       3         12.1       14.2        4.0      3.7
## 4       4         10.9       12.5        4.2      3.8
# Pasar de formato ancho a largo
datos_largo <- datos_ancho %>%
  pivot_longer(
    cols = -muestra,
    names_to = "variable",
    values_to = "valor"
  )

datos_largo
## # A tibble: 16 × 3
##    muestra variable     valor
##      <int> <chr>        <dbl>
##  1       1 brix_inicial  10.5
##  2       1 brix_final    12.8
##  3       1 ph_inicial     4.3
##  4       1 ph_final       3.9
##  5       2 brix_inicial  11.2
##  6       2 brix_final    13  
##  7       2 ph_inicial     4.1
##  8       2 ph_final       3.8
##  9       3 brix_inicial  12.1
## 10       3 brix_final    14.2
## 11       3 ph_inicial     4  
## 12       3 ph_final       3.7
## 13       4 brix_inicial  10.9
## 14       4 brix_final    12.5
## 15       4 ph_inicial     4.2
## 16       4 ph_final       3.8
# Separar variable en dos partes
datos_largo %>%
  separate(variable, into = c("indicador", "momento"), sep ="_")
## # A tibble: 16 × 4
##    muestra indicador momento valor
##      <int> <chr>     <chr>   <dbl>
##  1       1 brix      inicial  10.5
##  2       1 brix      final    12.8
##  3       1 ph        inicial   4.3
##  4       1 ph        final     3.9
##  5       2 brix      inicial  11.2
##  6       2 brix      final    13  
##  7       2 ph        inicial   4.1
##  8       2 ph        final     3.8
##  9       3 brix      inicial  12.1
## 10       3 brix      final    14.2
## 11       3 ph        inicial   4  
## 12       3 ph        final     3.7
## 13       4 brix      inicial  10.9
## 14       4 brix      final    12.5
## 15       4 ph        inicial   4.2
## 16       4 ph        final     3.8
# Ejemplo de formato largo a ancho
datos_tidy <- datos_largo %>%
  separate(variable, into = c("indicador", "momento"), sep ="_") %>%
  pivot_wider(
    names_from = indicador,
    values_from = valor
  )

datos_tidy
## # A tibble: 8 × 4
##   muestra momento  brix    ph
##     <int> <chr>   <dbl> <dbl>
## 1       1 inicial  10.5   4.3
## 2       1 final    12.8   3.9
## 3       2 inicial  11.2   4.1
## 4       2 final    13     3.8
## 5       3 inicial  12.1   4  
## 6       3 final    14.2   3.7
## 7       4 inicial  10.9   4.2
## 8       4 final    12.5   3.8

12. Idea Para Conectar con ggplot2

# Estos resúmenes luego se pueden graficar fácilmente con ggplot2
resumen_producto <- datos %>%
  group_by(producto) %>%
  summarise(
    brix_prom = mean(brix),
    humedad_prom = mean(humedad),,
    .groups = "drop"
  )

resumen_producto
## # A tibble: 2 × 3
##   producto brix_prom humedad_prom
##   <chr>        <dbl>        <dbl>
## 1 Guayaba       11.0         49.9
## 2 Mango         12.8         49.9