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