r r-factor sapply

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