Crear tablas de frecuencia para columnas de mĂșltiples factores en R
r-factor sapply (3)
Soy un novato en R. Estoy compilando un manual separado sobre la sintaxis de las funciones / características comunes para mi trabajo. Mi marco de datos de muestra de la siguiente manera:
x.sample <-
structure(list(Q9_A = structure(c(5L, 3L, 5L, 3L, 5L, 3L, 1L,
5L, 5L, 5L), .Label = c("Impt", "Neutral", "Not Impt at all",
"Somewhat Impt", "Very Impt"), class = "factor"), Q9_B = structure(c(5L,
5L, 5L, 3L, 5L, 5L, 3L, 5L, 3L, 3L), .Label = c("Impt", "Neutral",
"Not Impt at all", "Somewhat Impt", "Very Impt"), class = "factor"),
Q9_C = structure(c(3L, 5L, 5L, 3L, 5L, 5L, 3L, 5L, 5L, 3L
), .Label = c("Impt", "Neutral", "Not Impt at all", "Somewhat Impt",
"Very Impt"), class = "factor")), .Names = c("Q9_A", "Q9_B",
"Q9_C"), row.names = c(NA, 10L), class = "data.frame")
> x.sample
Q9_A Q9_B Q9_C
1 Very Impt Very Impt Not Impt at all
2 Not Impt at all Very Impt Very Impt
3 Very Impt Very Impt Very Impt
4 Not Impt at all Not Impt at all Not Impt at all
5 Very Impt Very Impt Very Impt
6 Not Impt at all Very Impt Very Impt
7 Impt Not Impt at all Not Impt at all
8 Very Impt Very Impt Very Impt
9 Very Impt Not Impt at all Very Impt
10 Very Impt Not Impt at all Not Impt at all
Mi marco de datos original tiene 21 columnas.
Si quiero encontrar la media (tratando esto como una variable ordinal):
> sapply(x.sample,function(x) mean(as.numeric(x), na.rm=TRUE))
Q9_A Q9_B Q9_C
4.0 4.2 4.2
Me gustaría tabular una tabla de frecuencias para TODAS las variables en mi marco de datos. Busqué en Internet y en muchos foros y vi que el comando más cercano para hacer esto es usar sapply. Pero cuando lo hice, me dio todos los ceros.
> sapply(x.sample,function(x) table(factor(x.sample, levels=c("Not Impt at all", "Somewhat Impt", "Neutral", "Impt", "Very Impt"), ordered=TRUE)))
Q9_A Q9_B Q9_C
Not Impt at all 0 0 0
Somewhat Impt 0 0 0
Neutral 0 0 0
Impt 0 0 0
Very Impt 0 0 0
PREGUNTA ¿Cómo puedo hacer uso de sapply para tabular un gráfico de frecuencia según la tabla anterior para todas las columnas (que son factores) en un marco de datos?
PD: Perdón si esto parece trivial, pero he buscado durante 2 días sin respuesta e intentando todas las combinaciones posibles. Tal vez no busqué lo suficiente = (
Muchas gracias.
¿Por qué no solo:
> sapply(x.sample, table)
Q9_A Q9_B Q9_C
Impt 1 0 0
Neutral 0 0 0
Not Impt at all 3 4 4
Somewhat Impt 0 0 0
Very Impt 6 6 6
Llamémoslo ''tbl'';
tbl[ order(match(rownames(tbl), c("Not Impt at all", "Somewhat Impt",
"Neutral", "Impt", "Very Impt")) ) , ]
Q9_A Q9_B Q9_C
Not Impt at all 3 4 4
Somewhat Impt 0 0 0
Neutral 0 0 0
Impt 1 0 0
Very Impt 6 6 6
Llego un poco tarde, pero aquí hay una posible solución
reshape2
.
Podría haber sido muy sencillo con la
recast
pero tenemos que manejar los niveles de factores vacíos aquí, por lo que debemos especificar ambos
factorsAsStrings = FALSE
dentro de
melt
y
drop = FALSE
dentro de
dcast
, mientras que la
recast
no puede pasar argumentos para
melt
(solo para
dcast
), así que aquí va
library(reshape2)
x.sample$indx <- 1
dcast(melt(x.sample, "indx", factorsAsStrings = FALSE), value ~ variable, drop = FALSE)
# value Q9_A Q9_B Q9_C
# 1 Impt 1 0 0
# 2 Neutral 0 0 0
# 3 Not Impt at all 3 4 4
# 4 Somewhat Impt 0 0 0
# 5 Very Impt 6 6 6
Si no nos importaran los niveles vacíos, una solución rápida sería
recast(x.sample, value ~ variable, id.var = "indx")
# value Q9_A Q9_B Q9_C
# 1 Impt 1 0 0
# 2 Not Impt at all 3 4 4
# 3 Very Impt 6 6 6
Alternativamente, si la velocidad es una preocupación, podemos hacer lo mismo usando
data.atble
library(data.table)
dcast(melt(setDT(x.sample), measure.vars = names(x.sample), value.factor = TRUE),
value ~ variable, drop = FALSE)
# value Q9_A Q9_B Q9_C
# 1: Impt 1 0 0
# 2: Neutral 0 0 0
# 3: Not Impt at all 3 4 4
# 4: Somewhat Impt 0 0 0
# 5: Very Impt 6 6 6
Ya casi estabas allí.
Solo un pequeño cambio en su función lo habría llevado allí.
La
x
en la
function(x) ...
debe pasar a la llamada de la
table()
:
levs <- c("Not Impt at all", "Somewhat Impt", "Neutral", "Impt", "Very Impt")
sapply(x.sample, function(x) table(factor(x, levels=levs, ordered=TRUE)))
Una pequeña nueva versión del código también podría facilitar un poco la lectura:
sapply(lapply(x.sample,factor,levels=levs,ordered=TRUE), table)
# Q9_A Q9_B Q9_C
#Not Impt at all 3 4 4
#Somewhat Impt 0 0 0
#Neutral 0 0 0
#Impt 1 0 0
#Very Impt 6 6 6