从 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))
一个看似简单的任务在 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))