Oi Henrique.
Quem bom que conseguiu uma solução legal. Parabéns!
Gostaria de aproveitar pra apontar alguns pontos, não apenas pra você, mas quem nos lê também.
Primeiro é que se você utilizar duas colunas juntas, no table()
ou tabyl()
do janitor
eles cruzarão as variáveis, fazendo um tabela cruzada. Sua solução resolve esse problema.
Caso as categorias a serem calculadas sejam iguais, de fato, a sua solução é muito interessante. Eu ainda sugeria uma pequena alteração, incluindo a função prop.table()
do base, que já faz os cálculos com os totais. É apenas detalhe.
df <- data.frame(
coluna_1 = c("X", "X", "X", "A", "A", "A", "A", "C", "C", "C"),
coluna_2 = c("X", "X", "A", "A", "A", "A", "A", "A", "C", "C")
)
df |>
dplyr::select(coluna_1, coluna_2) |>
sapply(\(x) prop.table(table(x)) * 100 |> round(2)) |>
tibble::as_tibble()
#> # A tibble: 3 × 2
#> coluna_1 coluna_2
#> <dbl> <dbl>
#> 1 40 60
#> 2 30 20
#> 3 30 20
Created on 2022-12-09 with reprex v2.0.2
Mas, se as categorias das colunas forem de tamanhos diferentes dá erro.
df_1 <- data.frame(
coluna_1 = c("X", "X", "X", "A", "A", "A", "A", "C", "C", "C"),
coluna_2 = c("C", "C", "Z", "X", "S", "S", "S", "S", "T", "T") # coluna com categorias e tamanho diferentes
)
df_1 |>
dplyr::select(coluna_1, coluna_2) |>
sapply(\(x) prop.table(table(x)) * 100 |> round(2)) |>
tibble::as_tibble()
#> Error:
#> ! Tibble columns must have compatible sizes.
#> • Size 3: Column `coluna_1`.
#> • Size 5: Column `coluna_2`.
#> ℹ Only values of size one are recycled.
#> Backtrace:
#> ▆
#> 1. ├─tibble::as_tibble(...)
#> 2. └─tibble:::as_tibble.list(...)
#> 3. └─tibble:::lst_to_tibble(x, .rows, .name_repair, col_lengths(x))
#> 4. └─tibble:::recycle_columns(x, .rows, lengths)
#> 5. └─rlang::cnd_signal(...)
Created on 2022-12-09 with reprex v2.0.2
Outro ponto é se as categorias forem diferentes, mas de tamanhos iguais, a tabela final está mostrando adequadamente os dados?
df_2 <- data.frame(
coluna_1 = c("X", "X", "X", "A", "A", "A", "A", "C", "C", "C"),
coluna_2 = c("Z", "Z", "Z", "Y", "Y", "Y", "Y", "T", "T", "T")
)
df_2 |>
dplyr::select(coluna_1, coluna_2) |>
sapply(\(x) prop.table(table(x)) * 100 |> round(2)) |>
tibble::as_tibble()
#> # A tibble: 3 × 2
#> coluna_1 coluna_2
#> <dbl> <dbl>
#> 1 40 30
#> 2 30 40
#> 3 30 30
Created on 2022-12-09 with reprex v2.0.2
Apenas reflexões.