I often apply the table-function on each column of a data frame using plyr, like this:
You can try the following which does not rely on the tidyr package.
tidyr
mtcars %>% lapply(table) %>% lapply(as.data.frame) %>% Map(cbind,var = names(mtcars),.) %>% rbind_all() %>% group_by(var) %>% mutate(pct = Freq / sum(Freq))