Escala likert e problema com gather, group_by, summarise e spread

Oi, gente!

Eu possuo um questionário com x perguntas que as pessoas respondem com valores de 1 a 5. A minha tabela então é com y linhas, cada linha representando as respostas de 1 pessoa ao longo dessas colunas de perguntas. O que eu preciso fazer é como se fosse um count() de cada coluna, mas de todas ao mesmo tempo, e salvar isso em uma tabela.

Tenho aqui um exemplo:

exemplo <- data.frame("posso praticar" = c(1, 3, 3, 5, 4, 2, 2),
                       "temos tempo" = c(2, 2, 5, 4, 3, 5, 1),
                       "recebo feebback" = c(1, 1, 1, 5, 3, 2, 4),
                       "bom lider" = c(5, 5, 4, 4, 3, 2, 1))

> exemplo
  posso.praticar temos.tempo recebo.feebback bom.lider
1              1           2               1         5
2              3           2               1         5
3              3           5               1         4
4              5           4               5         4
5              4           3               3         3
6              2           5               2         2
7              2           1               4         1

Eu encontrei um código no stackoverflow que faz essa soma, mas eu não tenho ideia de como ele funciona… A única coisa que eu fiz nele foi chamar de “likert” o espaço que eu entendi que era referente as colunas e “freq” o que receberia as categorias a serem somadas. Foi total tentativa e erro, então a primeira coisa que eu peço é ajuda pra entender o porquê desse código ter funcionado hahaha

soma <- exemplo %>% 
  gather(likert, freq) %>%
  group_by(likert, freq) %>%
  summarise(no = n()) %>%
  spread(likert, no)

> soma
# A tibble: 5 x 5
   freq bom.lider posso.praticar recebo.feebback temos.tempo
  <dbl>     <int>          <int>           <int>       <int>
1     1         1              1               3           1
2     2         1              2               1           2
3     3         1              2               1           1
4     4         2              1               1           1
5     5         2              1               1           2

O segundo problema é que a tabela gerada tem as colunas em ordem diferente da primeira, e é importante pra mim que elas sigam exatamente a mesma ordem porque depois eu me baseio nisso pra dividir em grupos menores (depender dos nomes das colunas é ruim porque são perguntas gigantes).

Como eu consigo resolver essa questão da ordem das colunas? Quando eu rodo esse código da soma aparece a mensagem:

``summarise()regrouping output by 'likert' (override with.groups argument)

Eu testei os argumentos do .groups dentro do summarise mas nenhum deu certo (achei que o “drop” fosse resolver).

Obrigada pela atenção!!
:woozy_face: :pray:

Oi Lousie, tudo bem?

Primeiro sobre a mensagem, estranho o “drop” não ter funcionado, aqui com o argumento não recebo mensagem, replicando o seu código e só trocando o argumento .groups.

Para manter a ordem das colunas iniciais, basta colocar um select(…, colnames(exemplo)) no final do pipe.

soma <- exemplo %>% 
  gather(likert, freq) %>%
  group_by(likert, freq) %>%
  summarise(no = n(), .groups='drop') %>%
  spread(likert, no) %>%
  select(freq, colnames(exemplo))

isso retornaria o seguinte objeto

> soma
# A tibble: 5 × 5
   freq posso.praticar temos.tempo recebo.feebback bom.lider
  <dbl>          <int>       <int>           <int>     <int>
1     1              1           1               3         1
2     2              2           2               1         1
3     3              2           1               1         1
4     4              1           1               1         2
5     5              1           2               1         2

Agora, para entender pq esse código funciona, a melhor forma é executar ele passo a passo e ver a saída

exemplo %>% 
  gather(likert, freq)

depois

exemplo %>% 
  gather(likert, freq) %>%
  group_by(likert, freq) %>%
  summarise(no = n(), .groups='drop')

depois

exemplo %>% 
  gather(likert, freq) %>%
  group_by(likert, freq) %>%
  summarise(no = n(), .groups='drop') %>%
  spread(likert, no)

Dito isso, o que o código faz é transformar os dados para o que se chama de formato “long”, faz as contagens das combinações, e transforma de volta para o formato “wide”. Normalmente é boa prática e muito mais fácil trabalhar com dados no formato “long”. Esse link explica bem isso de dados long e wide: 12 Tidy data | R for Data Science

Obs: as funções gather e spread acho que estão sendo superadas pelas funções pivot_wider e pivot_longer, mas ainda funcionam.

Espero ter ajudado.

2 Curtidas

Oi Daniel, muito obrigada!!! Ajudou bastante :smiling_face_with_three_hearts:

Eu imaginei que tinha alguma coisa a ver com esses formatos, mas isso é o maior nó na minha cabeça hahaha Valeu pela indicação de leitura!

Abraço!