Crear tablas de frecuencia para columnas de factores múltiples en R

Soy un principiante en R. Estoy comstackndo un manual separado sobre la syntax para las funciones / funciones comunes para mi trabajo. Mi dataframe de muestra de la siguiente manera:

x.sample  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 dataframe 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 dataframe. Busqué en Internet y muchos foros y vi que el comando más cercano para hacer esto es usar sapply. Pero cuando lo hice, dio todos los 0.

 > 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 utilizar Sapply para tabular un gráfico de frecuencia según la tabla anterior para todas las columnas (que son factores) en un dataframe?

PD: Lo siento si esto parece trivial pero he buscado durante 2 días sin respuesta y probando todas las combinaciones posibles. Tal vez no busqué lo suficiente = (

Muchas gracias.

Estabas casi allí. Solo un pequeño cambio en tu función te hubiera llevado allí. La function(x) ... x en la function(x) ... debe pasarse a la llamada a 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))) 

Un pequeño re-jig del código puede hacer que sea un poco más fácil de leer también:

 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 

Llegando un poco tarde, pero aquí hay una posible solución. Podría haber sido muy sencillo con la recast pero tenemos que manejar los niveles de factores vacíos aquí, así que debemos especificar ambos factorsAsStrings = FALSE dentro de melt y drop = FALSE dentro de dcast , mientras que la recast no puede pasar los argumentos a melt (solo a 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 importan los niveles vacíos, una solución rápida sería solo

 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 

¿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 

Vamos a llamarlo ‘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 
    Intereting Posts