Bases de R + Introducción a dplyr y tidyr

1. Ayuda en R

mean sd data.frame factor

2. Vectores: Datos Agroindustriales Básicos

# Ejemplo 1: Sólidos solubrles (°Brix) en pulpa de fruta 

brix <- c(10.2,11.5,10.8,12.1,11.7)
brix
## [1] 10.2 11.5 10.8 12.1 11.7
class(brix)
## [1] "numeric"
mean(brix)  # Promedio
## [1] 11.26
sd(brix)    # Desviación estándar
## [1] 0.7569676
median(brix) # Mediana
## [1] 11.5
max(brix)    # Máximo
## [1] 12.1
min(brix)    # Mínimo
## [1] 10.2
# Ejemplo 2: Datos con valor faltante 

humedad <- c(78.5,80.1,79.4,NA,81.0)
humedad
## [1] 78.5 80.1 79.4   NA 81.0
class(humedad)
## [1] "numeric"
mean(humedad, na.rm = T)  # Promedio
## [1] 79.75
sd(humedad, na.rm = T)    # Desviación estándar
## [1] 1.059874
humedad_caracter <- c(78.5,80.1,79.4,NA,81.0,"90")
class(humedad_caracter)
## [1] "character"

3. Operaciones Básicas

# Conversión simple: Rendimiento en Kg de pupla útil
peso_fruta <-c(1.2,1.5,1.3,1.4,1.6)
fraccion_util<-c(0.68,0.72,0.70,0.69,0.71)
pulpa_util<-peso_fruta*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

# Tipo de fruta procesada
fruta <-c("Mango", "Mango", "Guayaba", "Guayaba", "Mango")
fruta
## [1] "Mango"   "Mango"   "Guayaba" "Guayaba" "Mango"
class(fruta)
## [1] "character"
# Convertir a factor
fruta_f <-factor(fruta)
class(fruta_f)
## [1] "factor"
levels(fruta_f)
## [1] "Guayaba" "Mango"
table(fruta_f)
## fruta_f
## Guayaba   Mango 
##       2       3
# Tratamiento de secado
tratamiento <-c("60C","70C","60C","80C","70C","80C")
tratamiento_f <-factor(tratamiento)

levels(tratamiento_f)
## [1] "60C" "70C" "80C"
table(tratamiento_f)
## tratamiento_f
## 60C 70C 80C 
##   2   2   2

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 el primero
## [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
brix
## [1] 10.2 11.5 10.8 12.1 11.7
brix[1]  # Primer valor
## [1] 10.2
brix[4]  # Cuarto valor
## [1] 12.1
brix[-1] # Todos excepto el primero
## [1] 11.5 10.8 12.1 11.7
brix[brix >12] # Valores mayores a 12
## [1] 12.1
brix[brix <10] # Valores menores a 10
## numeric(0)
brix[brix !=10.8] # Valores mayores a 12
## [1] 10.2 11.5 12.1 11.7

6. Crear secuencias

temperatura <-seq(from = 40, to = 5000, by = 10)
temperatura
##   [1]   40   50   60   70   80   90  100  110  120  130  140  150  160  170  180
##  [16]  190  200  210  220  230  240  250  260  270  280  290  300  310  320  330
##  [31]  340  350  360  370  380  390  400  410  420  430  440  450  460  470  480
##  [46]  490  500  510  520  530  540  550  560  570  580  590  600  610  620  630
##  [61]  640  650  660  670  680  690  700  710  720  730  740  750  760  770  780
##  [76]  790  800  810  820  830  840  850  860  870  880  890  900  910  920  930
##  [91]  940  950  960  970  980  990 1000 1010 1020 1030 1040 1050 1060 1070 1080
## [106] 1090 1100 1110 1120 1130 1140 1150 1160 1170 1180 1190 1200 1210 1220 1230
## [121] 1240 1250 1260 1270 1280 1290 1300 1310 1320 1330 1340 1350 1360 1370 1380
## [136] 1390 1400 1410 1420 1430 1440 1450 1460 1470 1480 1490 1500 1510 1520 1530
## [151] 1540 1550 1560 1570 1580 1590 1600 1610 1620 1630 1640 1650 1660 1670 1680
## [166] 1690 1700 1710 1720 1730 1740 1750 1760 1770 1780 1790 1800 1810 1820 1830
## [181] 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980
## [196] 1990 2000 2010 2020 2030 2040 2050 2060 2070 2080 2090 2100 2110 2120 2130
## [211] 2140 2150 2160 2170 2180 2190 2200 2210 2220 2230 2240 2250 2260 2270 2280
## [226] 2290 2300 2310 2320 2330 2340 2350 2360 2370 2380 2390 2400 2410 2420 2430
## [241] 2440 2450 2460 2470 2480 2490 2500 2510 2520 2530 2540 2550 2560 2570 2580
## [256] 2590 2600 2610 2620 2630 2640 2650 2660 2670 2680 2690 2700 2710 2720 2730
## [271] 2740 2750 2760 2770 2780 2790 2800 2810 2820 2830 2840 2850 2860 2870 2880
## [286] 2890 2900 2910 2920 2930 2940 2950 2960 2970 2980 2990 3000 3010 3020 3030
## [301] 3040 3050 3060 3070 3080 3090 3100 3110 3120 3130 3140 3150 3160 3170 3180
## [316] 3190 3200 3210 3220 3230 3240 3250 3260 3270 3280 3290 3300 3310 3320 3330
## [331] 3340 3350 3360 3370 3380 3390 3400 3410 3420 3430 3440 3450 3460 3470 3480
## [346] 3490 3500 3510 3520 3530 3540 3550 3560 3570 3580 3590 3600 3610 3620 3630
## [361] 3640 3650 3660 3670 3680 3690 3700 3710 3720 3730 3740 3750 3760 3770 3780
## [376] 3790 3800 3810 3820 3830 3840 3850 3860 3870 3880 3890 3900 3910 3920 3930
## [391] 3940 3950 3960 3970 3980 3990 4000 4010 4020 4030 4040 4050 4060 4070 4080
## [406] 4090 4100 4110 4120 4130 4140 4150 4160 4170 4180 4190 4200 4210 4220 4230
## [421] 4240 4250 4260 4270 4280 4290 4300 4310 4320 4330 4340 4350 4360 4370 4380
## [436] 4390 4400 4410 4420 4430 4440 4450 4460 4470 4480 4490 4500 4510 4520 4530
## [451] 4540 4550 4560 4570 4580 4590 4600 4610 4620 4630 4640 4650 4660 4670 4680
## [466] 4690 4700 4710 4720 4730 4740 4750 4760 4770 4780 4790 4800 4810 4820 4830
## [481] 4840 4850 4860 4870 4880 4890 4900 4910 4920 4930 4940 4950 4960 4970 4980
## [496] 4990 5000
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
# Cambio de factores a algunas columnas


# Ver nombre 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 básica de variables

# 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
hist(datos$brix)

# Promedio de °Brix
mean(datos$brix)
## [1] 11.925
# Promedio de humedad
mean(datos$humedad)
## [1] 49.9
# Tabla de frecuencias para producto
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 = "Distribucción de humedad",
     xlab = "Humedad(%)",
     col = "lightgreen")

# Boxplot de °Brix por producto
boxplot(brix ~ producto, data = datos,
     main = "°Brix por tipo de producto",
     xlab = "Fruta",
     ylab = "°Brix",
     col = "lightyellow")

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

# Boxplot de humedad de tratamiento
boxplot(brix ~ producto, data = datos,
     main = "°Brix por tipo de producto",
     xlab = "Fruta",
     ylab = "°Brix",
     col = "red")

10. Introducción a 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 %>%
  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 %>%
  filter(humedad < 30)
##   muestra producto tratamiento brix  ph humedad
## 1       2    Mango      Secado 13.4 4.0    18.5
## 2       4  Guayaba      Secado 11.8 3.8    20.1
## 3       6  Guayaba      Secado 11.1 3.9    19.3
## 4       7    Mango      Secado 13.0 4.0    17.8
# 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(
    n = n(),
    brix_prom = mean(brix),
    ph_prom = mean(ph),
    humedad_prom = mean(humedad)
  )
## # A tibble: 2 × 5
##   producto     n brix_prom ph_prom humedad_prom
##   <chr>    <int>     <dbl>   <dbl>        <dbl>
## 1 Guayaba      4      11.0    3.8          49.9
## 2 Mango        4      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

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

# Graficación de resumenes 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