es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo replicar la misma expresión con el operador de tubería tidyverse en R?

Me gustaría resaltar los valores correspondientes en cada columna de los datos utilizando DT::datatable.

Por ejemplo:

library(tidyverse)
data(mtcars)
mtcars <- mtcars %>% mutate(across(everything(), as.character))

datatable(mtcars[, c("vs", "am")]) %>%
  formatStyle("vs", backgroundColor = styleEqual(rep(0, sum(mtcars$vs == 0)), rep("yellow", sum(mtcars$vs == 0)))) %>%
  formatStyle("am", backgroundColor = styleEqual(rep(1, sum(mtcars$am == 1)), rep("yellow", sum(mtcars$am == 1))))

En el caso real, tengo múltiples columnas y me gustaría iterar sobre todas las columnas para agregar formatStyle. ¿Existe alguna forma de replicar el %>% formatStyle() en el bucle?


<h1>algo para comenzar</h1> <p>l <- list() l[["vs"]] <- 0 l[["am"]] <- 1</p> <p>datatable(mtcars[, c("vs", "am")]) %>% lapply(l, function(i) { i ... # múltiples formatStyle() })

El propósito de la iteración en cada columna no es resaltar el 1 en vs ni el 0 en am.

¡Gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar lapply para iterar a través de cada columna y aplicar la función formatStyle a cada una. Aquí tienes un ejemplo de código para lograr esto:

    “`{r}
    library(DT)
    library(tidyverse)

    Cargar datos de ejemplo

    data(mtcars)
    mtcars <- mtcars %>% mutate(across(everything(), as.character))

    Definir una lista de columnas en las que se aplicará formatStyle

    cols <- c(“vs”, “am”)

    Crear una lista de argumentos para pasar a formatStyle

    format_args <- lapply(cols, function(col) {
    # Definir el color de fondo basado en los valores únicos de la columna
    bg_colors <- setNames(rep(“yellow”, length(unique(mtcars[[col]]))), unique(mtcars[[col]]))
    styleEqual(mtcars[[col]], bg_colors)
    })

    Aplicar formatStyle a cada columna usando lapply y reduce

    datatable(mtcars[, cols]) %>%
    reduce(formatStyle, args = format_args)
    “`

    En este fragmento de código, primero definimos la lista de columnas a las que se aplicará formatStyle (cols). Luego, usamos lapply para iterar a través de cada columna y crear una lista de argumentos para pasar a formatStyle. En este caso, definimos el color de fondo para cada valor único en la columna usando setNames y rep, y luego usamos styleEqual para crear el argumento para formatStyle.

    Finalmente, aplicamos formatStyle a cada columna usando reduce de paquete purrr, pasando la lista de argumentos creada por lapply. Esto produce una datatable con los valores correspondientes resaltados en cada columna.

Comments are closed.