Create frequency tables for multiple factor columns in R Create frequency tables for multiple factor columns in R r r

Create frequency tables for multiple factor columns in R


You were nearly there. Just one small change in your function would have got you there. The x in function(x) ... needs to be passed through to the table() call:

levs <- c("Not Impt at all", "Somewhat Impt", "Neutral", "Impt", "Very Impt")sapply(x.sample, function(x) table(factor(x, levels=levs, ordered=TRUE)))

A little re-jig of the code might make it a bit easier to read too:

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


Coming a bit late, but here's a reshape2 possible solution. It could have been very straightforward with recast but we need to handle empty factor levels here so we need to specify both factorsAsStrings = FALSE within melt and drop = FALSE within dcast, while recast can't pass arguments to melt (only to dcast), so here goes

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

If we wouldn't care about empty levels a quick solution would be just

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

Alternatively, if speed is a concern, we can do the same using 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


Why not just:

> sapply(x.sample, table)                Q9_A Q9_B Q9_CImpt               1    0    0Neutral            0    0    0Not Impt at all    3    4    4Somewhat Impt      0    0    0Very Impt          6    6    6

Let's call it 'tbl';

tbl[ order(match(rownames(tbl), c("Not Impt at all", "Somewhat Impt",                                   "Neutral", "Impt", "Very Impt")) )   , ]                Q9_A Q9_B Q9_CNot Impt at all    3    4    4Somewhat Impt      0    0    0Neutral            0    0    0Impt               1    0    0Very Impt          6    6    6