Un extraño truco para obtener el máximo (o el mínimo)

Motivación

Me etiquetaron en Twitter sobre la siguiente pregunta:

¿Cómo puedo elegir una fecha máxima por fila? Tengo un cuadro de datos con 3 columnas con fechas, y quiero crear una 4ta columna que tenga el máximo de esas 3 para cada fila.

Conjunto de datos

En primer lugar, creamos un cuadro de datos con fechas, supongamos que contiene los tres últimos días en los que la gente utilizó el autobús en lugar del metro.

library(dplyr)
library(stringr)

set.seed(1234)

d <- tibble(
  nombre = factor(c("George", "John", "Paul", "Ringo")),
  dia1 = paste0("2022-05-", str_pad(sample(1:10, 4), 2, "left", "0")),
  dia2 = paste0("2022-05-", sample(11:20, 4)),
  dia3 = paste0("2022-05-", sample(21:30, 4))
) %>% 
  mutate_if(is.character, as.Date)

d
## # A tibble: 4 × 4
##   nombre dia1       dia2       dia3      
##   <fct>  <date>     <date>     <date>    
## 1 George 2022-05-10 2022-05-19 2022-05-22
## 2 John   2022-05-06 2022-05-15 2022-05-27
## 3 Paul   2022-05-05 2022-05-16 2022-05-26
## 4 Ringo  2022-05-04 2022-05-14 2022-05-30

En este caso, la columna de “día 3” es la fecha máxima por fila, pero el ejemplo sigue siendo aplicable para el caso general.

Sin reestructurar

Aquí utilizamos pmax() (o pmin() para el mínimo).

d %>% 
  mutate(
    max_dia = pmax(dia1, dia2, dia3)
  )
## # A tibble: 4 × 5
##   nombre dia1       dia2       dia3       max_dia   
##   <fct>  <date>     <date>     <date>     <date>    
## 1 George 2022-05-10 2022-05-19 2022-05-22 2022-05-22
## 2 John   2022-05-06 2022-05-15 2022-05-27 2022-05-27
## 3 Paul   2022-05-05 2022-05-16 2022-05-26 2022-05-26
## 4 Ringo  2022-05-04 2022-05-14 2022-05-30 2022-05-30

Reestructurado

Qué pasaría si tuviéramos más columnas, por ejemplo, si tuviéramos 10 o más columnas con fechas. Aunque no es el caso de este ejemplo, es útil saber qué hacer en esas situaciones. Aquí imprimo el resultado y luego calculo la operación para mayor claridad, luego uso max() (o min() para el mínimo).

library(tidyr)

d2 <- d %>% 
  gather("dia", "valor", -nombre)

d2
## # A tibble: 12 × 3
##    nombre dia   valor     
##    <fct>  <chr> <date>    
##  1 George dia1  2022-05-10
##  2 John   dia1  2022-05-06
##  3 Paul   dia1  2022-05-05
##  4 Ringo  dia1  2022-05-04
##  5 George dia2  2022-05-19
##  6 John   dia2  2022-05-15
##  7 Paul   dia2  2022-05-16
##  8 Ringo  dia2  2022-05-14
##  9 George dia3  2022-05-22
## 10 John   dia3  2022-05-27
## 11 Paul   dia3  2022-05-26
## 12 Ringo  dia3  2022-05-30
d2 %>% 
  group_by(nombre) %>% 
  summarise(max_dia = max(valor))
## # A tibble: 4 × 2
##   nombre max_dia   
##   <fct>  <date>    
## 1 George 2022-05-22
## 2 John   2022-05-27
## 3 Paul   2022-05-26
## 4 Ringo  2022-05-30

Ya que estás leyendo mi blog

Estoy haciendo clases de R y Shiny como una forma de generar ingresos como estudiante internacional. Ofrezco clases con un 50% de descuento para personas en América Latina que estén interesadas.

Te ayudaré a entender los fundamentos de R o Shiny de manera que contribuya a tu trabajo diario.

Si tienes conocimientos de hojas de cálculo, también te mostraré cómo aplicar estos conocimientos a la escritura de código.

Cada sesión consiste en una hora en Zoom, centrada en las preguntas y datos que acordemos previamente. Todas las sesiones de tutoría son diferentes, ya que creo las diapositivas y los códigos de ejemplo a la medida de cada alumno.

Aquí hay una demostración breve de lo que hago https://www.youtube.com/watch?v=DW-HPfohfwg.

Puedes agendar en https://www.buymeacoffee.com/pacha/e/81873.