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.

Agregación secuencial con una sola llamada a pivot_wider

Considere el dataframe:

df <- data.frame(x = c(1,2,1,1), y = c(“a”, “a”, “b”, “a”))

Al aplicar el siguiente código

library(tidyverse)

df %>% 
  pivot_wider(names_from = y, values_from = y, values_fn = length, names_prefix = "tot_", values_fill = 0) %>% 
  mutate(per_a = 100*tot_a / rowSums(select(.,starts_with("tot_")))) %>% 
  mutate(per_b = 100*tot_b / rowSums(select(.,starts_with("tot_"))))

se obtiene el resultado


1 1 2 1 66.7 33.3
2 2 1 0 100 0

Mi pregunta es: ¿Es posible obtener el mismo resultado utilizando una única llamada a pivot_wider, es decir, sin ninguna mutate?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener el mismo resultado utilizando una sola llamada de pivot_wider:

    library(tidyverse)
    
    df %>% 
      pivot_wider(names_from = y, values_from = y, values_fn = list(length), 
                  names_prefix = "tot_", values_fill = list(length = 0)) %>% 
      mutate(across(starts_with("tot_"), 
                    ~ .x/sum(c_across(starts_with("tot_")))*100, 
                    .names = "per_{col}"))
    

    Este código crea un formato ancho del dataframe df con los conteos de cada valor de y. El argumento values_fn se establece en list(length) para contar el número de apariciones de cada valor de y. El argumento values_fill también se establece en list(length = 0) para rellenar los valores faltantes con ceros.

    Luego, se utiliza la función mutate con la función across para calcular el porcentaje de cada valor de y (a y b) con respecto al conteo total de cada fila (que se obtiene sumando todas las columnas que comienzan con "tot_"). El argumento .names se utiliza para crear nombres de columna con el prefijo "per_" y los nombres de columna originales de las columnas tot_.

Comments are closed.