Solución:
Una forma de resolver esto es convertir sus datos a un formato más largo. Luego puede usar el mismo código para calcular los resultados que desea, con un group_by adicional:
library(reshape2)
library(dplyr)
m_mtcars <- melt(mtcars,measure.vars=c("gear","carb","cyl"))
res <- m_mtcars %>%
group_by(am, variable, value) %>%
summarise (n = n()) %>%
mutate(freq = n / sum(n))
Sobre la base de esto, la salida deseada se puede obtener mediante más remodelación y algo de formato de cadena
#make an 'export' variable
res$export <- with(res, sprintf("%i (%.1f%%)", n, freq*100))
#reshape again
output <- dcast(variable+value~am, value.var="export", data=res, fill="missing") #use drop=F to prevent silent missings
#'silent missings'
output$variable <- as.character(output$variable)
#make 'empty lines'
empties <- data.frame(variable=unique(output$variable), stringsAsFactors=F)
empties[,colnames(output)[-1]] <- ""
#bind them together
output2 <- rbind(empties,output)
output2 <- output2[order(output2$variable,output2$value),]
#optional: 'remove' variable if value present
output2$variable[output2$value!=""] <- ""
Esto resulta en:
variable value 0 1
2 carb
7 1 3 (15.8%) 4 (30.8%)
8 2 6 (31.6%) 4 (30.8%)
9 3 3 (15.8%) missing
10 4 7 (36.8%) 3 (23.1%)
11 6 missing 1 (7.7%)
12 8 missing 1 (7.7%)
3 cyl
13 4 3 (15.8%) 8 (61.5%)
14 6 4 (21.1%) 3 (23.1%)
15 8 12 (63.2%) 2 (15.4%)
1 gear
4 3 15 (78.9%) missing
5 4 4 (21.1%) 8 (61.5%)
6 5 missing 5 (38.5%)
Con la combinación tidyr / dplyr, así es como lo haría:
library(tidyr)
library(dplyr)
mtcars %>%
gather(variable, value, gear, carb, cyl) %>%
group_by(am, variable, value) %>%
summarise (n = n()) %>%
mutate(freq = n / sum(n))
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)