Tidyverse CrossTable Dplyr Tidyr
 
Você não precisa usar o R, mas provavelmente é uma boa ideia.
Existem muitas opções para produzir tabelas de contingência e tabelas de resumo em R.
No passado, para fazer uma tabela cruzada, era utilizado um comando do tipo:
table(bancodedados$variavel1,bancodedados$variavel2)
Para fazer uma proporção, era necessário fazer algo parecido com:
pro.table(table(bancodedados$variavel1,bancodedados$variavel2),2)*100)
Vamos revisar esse e outros métodos. Pretendo fazer hoje algo do tipo:
O uso do dplyr para produzir estatísticas permite que você continue o código sem problemas na próxima tarefa (filtragem, plotagem, etc.).
Os comandos group_by(), resume() e spread() são uma combinação útil para produzir valores agregados ou resumidos de um bancos de dados.
Primeiro, vamos carregar os dois pacotes dplyr & tidyr.
library(dplyr)
library(tidyr)Usaremos o banco de dados CARROS para essas atividades.
source('https://raw.githubusercontent.com/DATAUNIRIO/Miscellaneous_Functions_Rstats/master/CARROS.R',encoding = "UTF-8")library(DT)
CARROS %>% datatable(options = list(pageLength = 5, dom = 'tip'),fillContainer = FALSE,
caption = 'Tabela 1: Base de dados CARROS.')Aqui, podemos obter o número total de carros com cada combinação de Tipo de combustível (var:"Tipodecombustivel") e Tipo de Marcha (var:"TipodeMarcha") usando group_by() e summarize().
CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha) %>%
  summarize(n=n()) %>%
  datatable()Para transformar esses dados em uma tabela de cruzada ou de contingência, precisamos que a variável A (Tipodecombustivel) seja listada por linha e a variável B (TipodeMarcha) seja listada por coluna.
Podemos conseguir isso incluindo o comando spread(), para criar colunas para cada valor da variável TipodeMarcha, com n como o valor de resposta da tabela cruzada.
CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha)  %>%
  summarise(n=n()) %>%
  spread(TipodeMarcha, n) %>%
  datatable()Podemos encontrar proporções criando uma nova variável calculada, dividindo a frequência da linha pela frequência da tabela.
CARROS %>%
  group_by(Tipodecombustivel)  %>%
  summarise(n=n()) %>%
  mutate(prop=n/sum(n)*100) %>% 
  datatable()Podemos criar uma tabela de contingência de proporção aplicando o mesmo comando spread de antes. Varie os argumentos group_by() e spread() para produzir proporções de diferentes variáveis.
CARROS %>%
  group_by(Tipodecombustivel,TipodeMarcha)  %>%
  summarise(n=n()) %>%
  mutate(prop=n/sum(n)*100) %>% 
  subset(select=c("Tipodecombustivel","TipodeMarcha","prop")) %>%   #drop the frequency value
  spread(Tipodecombustivel, prop) %>%
  datatable()O comando table funciona bem para contagens, por exemplo:
table(CARROS$Tipodecombustivel,CARROS$TipodeMarcha) %>% datatable(rownames = FALSE)Todavia, acho anti-intuitivo quando trabalhamos com proporções.
data.frame(round(
  prop.table(table(CARROS$Tipodecombustivel,CARROS$TipodeMarcha),2)*100,2)) %>% datatable(rownames = FALSE)Se você precisar de algo rápido, execute o comando CrossTable() com duas variáveis.
Instale e carregue o pacote gmodels
install.packages("gmodels")
library(gmodels)CrossTable(CARROS$Tipodecombustivel,CARROS$TipodeMarcha)
 
   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|
 
Total Observations in Table:  32 
 
                         | CARROS$TipodeMarcha 
CARROS$Tipodecombustivel | Automático |     Manual |  Row Total | 
-------------------------|------------|------------|------------|
                Gasolina |         12 |          6 |         18 | 
                         |      0.161 |      0.236 |            | 
                         |      0.667 |      0.333 |      0.562 | 
                         |      0.632 |      0.462 |            | 
                         |      0.375 |      0.188 |            | 
-------------------------|------------|------------|------------|
                  Álcool |          7 |          7 |         14 | 
                         |      0.207 |      0.303 |            | 
                         |      0.500 |      0.500 |      0.438 | 
                         |      0.368 |      0.538 |            | 
                         |      0.219 |      0.219 |            | 
-------------------------|------------|------------|------------|
            Column Total |         19 |         13 |         32 | 
                         |      0.594 |      0.406 |            | 
-------------------------|------------|------------|------------|
 
ideia original e fonte: Analytics with R