从 R 中的李克特量表数据创建频率 Table

Creating Frequency Table from Likert Scale data in R

一个看似简单的任务在 R 中被证明是非常困难的。我正在处理包含命题的调查数据,这些命题要求受访者表明他们对 7 分李克特量表的同意或不同意程度。我正在尝试创建频率表(请参阅下面的 Table 1),以显示每个 sex/age 组类别中选择强烈同意、略微同意、同意、中立等的受访者比例作为回应每个命题。

如何从 Table 2 创建 Table 1(这是我当前数据帧在 R 中的设置方式)?在Table2中,标题为Q31、Q32、Q33和Q34的列分别是单独的命题,单元格中的值是李克特量表上7个选项的数字代码。

Table 1

Sex Age Group Question Strongly Agree
1 30 - 39 31 0.21
2 30 - 39 31 0.48
1 40 - 49 31 0.12
2 40 - 49 31 0.65

Table 2

Sex Age Group Q31 Q32 Q33 Q34
1 30 - 39 1 7 1 5
2 30 - 39 3 5 2 6
1 40 - 49 4 6 3 2
2 40 - 49 2 2 4 2

接受任何建议,因为我已经反对这个问题太久了!谢谢!

第一步可能是将您的宽数据转换为长格式(年龄、性别以及一列用于问题类型和一列用于该问题的答案)。使用这种长格式或整洁的数据,您可以轻松地按问题、年龄和性别分组,并计算每个答案的比例。

代码

library(tidyverse)

df %>% 
  pivot_longer(cols = -c(Sex, `Age Group`),
               names_to = "Question",
               values_to = "Value") %>%
  group_by(Question, Sex, `Age Group`) %>%
  summarise(`Strongly Agree` = sum(Value == 7)/n(),
            `Slightly Agree` = sum(Value == 6)/n(),
            Agree = sum(Value == 5)/n(),
            Neutral = sum(Value == 4)/n(),
            Disagree = sum(Value == 3)/n(),
            `Slightly Disagree` = sum(Value == 2)/n(),
            `Strongly Disagree` = sum(Value == 1)/n()) 

输出

# A tibble: 16 x 10
# Groups:   Question, Sex [8]
   Question   Sex `Age Group` `Strongly Agree` `Slightly Agree` Agree Neutral Disagree `Slightly Disagree` `Strongly Disagree`
   <chr>    <int> <fct>                  <dbl>            <dbl> <dbl>   <dbl>    <dbl>               <dbl>               <dbl>
 1 Q31          1 30-39                      0                0     0       0        0                   0                   1
 2 Q31          1 40-49                      0                0     0       1        0                   0                   0
 3 Q31          2 30-39                      0                0     0       0        1                   0                   0
 4 Q31          2 40-49                      0                0     0       0        0                   1                   0

注意:在您的示例中 table2 每个性别 x 年龄组合都存在一次,因此您的示例的比例为 0 或 1。

数据

df <- structure(list(Sex = c(1L, 2L, 1L, 2L), `Age Group` = structure(c(1L, 
1L, 2L, 2L), .Label = c("30-39", "40-49"), class = "factor"), 
    Q31 = c(1L, 3L, 4L, 2L), Q32 = c(7L, 5L, 6L, 2L), Q33 = 1:4, 
    Q34 = c(5L, 6L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
-4L))