Como utilizar o método `across` para sumarizar estatísticas diferentes

Olá a todos

Provavelmente o título do tópico não seja claro o suficiente para expressar com precisão a minha dúvida. A situação é a seguinte:

  1. Tenho uma data frame com 3 colunas numéricas: tt_alunos, tt_reprovacoes e i_reprov.
  2. As variáveis tt_alunos e tt_reprovacoes eu preciso grupar por cidades
  3. A variável indice_reprov, eu gostaria de calcular a média aritmética.

Segue um exemplo:

base ← data.frame(

cidades = c(“cidade 1”, “cidade 1”, “cidade 1”, “cidade 2”, “cidade 2”, “cidade 2,”, “cidade 2”),

escolas = c(“escola 1”, “escola 1”, “escola 2”, “Escola 3”, “escola 4”, “escola 4”, “escola 5”),

nro_alunos = c(100, 200, 150, 120, 140, 80, 130),

nro_reprovacoes = c(5, 12, 7, 2, 4, 13, 11),

irep = round(tt_reprovacoes/tt_alunos, 2)

)

Eu preciso consolidar os dados por cidades: somar_total_alunos, somar_total_reprovacoes, media_reprovacoes_por_cidade. Para isso, gostaria de usar a função across. Eu consegui fazer apenas somando todas as variáveis. Como faço para somar as duas primeiras variáveis e calcular a media da terceira na mesma linha? Segue até onde consegui:

baseAgrupada ← base |> dplyr::group_by(cidades) |>
dplyr::summarise(
dplyr::across(
.cols = c(tt_alunos = nro_alunos, tt_nn = nro_reprovacoes, irep),
.fns = sum, na.rm = T
) )

Obrigado, antecipadamente, pelo apoio de sempre.

Hidelbrando,

A função across() serve para facilitar a aplicação de uma mesma função a múltiplas colunas. Em algumas situações você pode até usar várias funções, mas elas vão ser aplicadas sempre a todas as colunas selecionadas no across().

Sendo assim, acredito que o código abaixo resolva o seu problema:

base <- tibble::tibble(
  cidades = c("cidade 1", "cidade 1", "cidade 1", "cidade 2", "cidade 2", "cidade 2", "cidade 2"),
  escolas = c("escola 1", "escola 1", "escola 2", "Escola 3", "escola 4", "escola 4", "escola 5"),
  nro_alunos = c(100, 200, 150, 120, 140, 80, 130),
  nro_reprovacoes = c(5, 12, 7, 2, 4, 13, 11),
  irep = round(nro_alunos/nro_reprovacoes, 2)
)

base |>
  dplyr::group_by(cidades) |>
  dplyr::summarise(
    dplyr::across(c(nro_alunos, nro_reprovacoes), sum),
    irep = mean(irep)
  )
#> # A tibble: 2 × 4
#>   cidades  nro_alunos nro_reprovacoes  irep
#>   <chr>         <dbl>           <dbl> <dbl>
#> 1 cidade 1        450              24  19.4
#> 2 cidade 2        470              30  28.2

Created on 2022-07-27 by the reprex package (v2.0.1)

1 curtida

Olá, Caio.

Ficou perfeito. Muito obrigado.

1 curtida