studio - tabla de frecuencia simple en r
convertir un marco de datos en una tabla de frecuencia formateada específicamente (2)
Tengo un data.frame y estoy tratando de crear una tabla de frecuencia que muestra la frecuencia de los valores para cada fila. Así que estoy empezando con algo como esto:
d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))
que se parece a esto:
a b c
1 3 1
2 4 2
3 5 5
Lo que realmente me gustaría crear es una matriz de datos de contingencia que se vea así:
1, 2, 3, 4, 5, 6, 7, 8, 9
2, 0, 1, 0, 0, 0, 0, 0, 0
0, 2, 0, 1, 0, 0, 0, 0, 0
0, 0, 1, 0, 2, 0, 0, 0, 0
La fila superior es simplemente una fila de etiquetas y no necesita estar en el resultado final. Pero lo agrego allí para ilustrar. Cada fila muestra los dígitos 1: 9 y la cantidad de veces que cada dígito aparece en cada fila de los datos de inicio.
No puedo envolver mi cabeza alrededor de una manera fácil de crear esto. Aunque parece que la función table()
debería ser útil, no puedo hacer que me brinde amor. Cualquier ayuda o ideas son apreciadas.
Aqui tienes:
t(apply(d, 1, tabulate, nbin=9))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2 0 1 0 0 0 0 0 0
[2,] 0 2 0 1 0 0 0 0 0
[3,] 0 0 1 0 2 0 0 0 0
(Aunque probablemente no importa en esta aplicación, tabulate()
(que se usa dentro del código para la table()
) también es bueno por la impresionante velocidad con la que realiza sus cálculos).
EDIT : tabulate()
no está configurado para tratar con 0s o enteros negativos. Si quieres otro forro que sí, puedes usar table()
, haciendo algo como esto:
d <- data.frame(a=c(0,-1,-2), b=c(3,4,5), c=c(1,2,5))
t(apply(d, 1, function(X) table(c(X, -9:9)) - 1))
-9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
[1,] 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0
[3,] 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0
otra solución usando mesa
library(reshape)
d <- data.frame(a=c(1,2,3), b=c(3,4,5), c=c(1,2,5))
d2 <- melt(d)
d2$rows <- rep(1:nrow(d), ncol(d))
table(d2$rows, d2$value)