r - ¿Cómo puedo transformar y contar datos?

CorePress2024-01-24  8

Tengo un data.frame con 4 variables categóricas con escala del 1 al 5.

data.frame(
  first=c(2,3,3,2,2),
  second=c(5,5,4,5,5),
  third=c(5,5,5,4,4),
  fourth=c(2,1,1,1,2))

first second third fourth 
  2     5      5     2      
  3     5      5     1     
  3     4      5     1      
  2     5      4     1      
  2     5      4     2     

Quiero transformar nombres de variables en una columna y hacer recuentos acumulativos de valores y configurar nuevas variables en filas con escala categórica.

newvar  1  2  3  4  5  
first   0  3  2  0  0  
second  0  0  0  1  4  
third   0  0  0  2  3
fourth  3  2  0  0  0


------------------------------------

Usando datos.table:

library(data.table)
dcast(melt(df), variable~value)

#  variable 1 2 3 4 5
#1    first 0 3 2 0 0
#2   second 0 0 0 1 4
#3    third 0 0 0 2 3
#4   fourth 3 2 0 0 0

Esto devuelve una advertencia, ya que confiamos en las opciones predeterminadas de melt y dcast, es seguro ignorarlas en este caso. Para evitar advertencias puedes utilizar esta versión extendida.

library(data.table)
dcast(melt(setDT(df), measure.vars = names(df)), variable~value, fun.aggregate = length)

0



------------------------------------

No es el método más limpio, pero funciona.

Utiliza pivot_longer para transformar los datos a un formato largo.

Luego podemos agrupar los datos y contar cuántas apariciones hay para cada una de las columnas originales.

Transforme los datos nuevamente a formato ancho usando pivot_wider y luego las dos últimas líneas reorganizan los datos para que coincidan con el resultado deseado.

df %>% 
  pivot_longer(c(first:fourth)) %>% 
  count(name, value) %>% 
  pivot_wider(names_from = "value",
              values_from = "n") %>% 
  select(name, `1`, `2`, `3`, `4`, `5`) %>% 
  arrange(match(name, c("first", "second", "third", "fourth")), desc(name))

0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare