Un extraño truco para obtener el máximo (o el mínimo)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.