我在 R(和 tidyverse)中使用来自问卷调查的数据,该问卷由 11 个问题组成,每个问题都以 4 分李克特量表回答:
数据位于一个数据框中,参与者为行,对每个问题的回答存储为单独列中的有序因素。
以下代码复制当前存储的 5 行数据:
library(tidyverse)
df <- tibble(id = c(1, 2, 3, 4, 5), q1 = c(3, 4, 2, 3, 3),
q2 = c(4, 4, 2, 3, 2), q3 = c(3, 3, 2, 2, 3),
q4 = c(2, 2, 3, 2, 1), q5 = c(3, 3, 3, 3, 3),
q6 = c(4, 3, 2, 2, 2), q7 = c(1, 2, 2, 2, 2),
q8 = c(3, 3, 3, 2, 1), q9 = c(3, 4, 4, 2, 1),
q10 = c(2, 4, 3, 2, 1), q11 = c(2, 3, 2, 2, 1)) %>%
mutate(across(q1:q11, ~factor(.x,
levels = c(1, 2, 3, 4),
labels = c("Less than usual",
"No more than usual",
"More than usual",
"Much more than usual"),
ordered = TRUE)))
str(df)
# tibble [5 × 12] (S3: tbl_df/tbl/data.frame)
# $ id : num [1:5] 1 2 3 4 5
# $ q1 : Ord.factor w/ 4 levels "Less than usual"<..: 3 4 2 3 3
# $ q2 : Ord.factor w/ 4 levels "Less than usual"<..: 4 4 2 3 2
# $ q3 : Ord.factor w/ 4 levels "Less than usual"<..: 3 3 2 2 3
# $ q4 : Ord.factor w/ 4 levels "Less than usual"<..: 2 2 3 2 1
# $ q5 : Ord.factor w/ 4 levels "Less than usual"<..: 3 3 3 3 3
# $ q6 : Ord.factor w/ 4 levels "Less than usual"<..: 4 3 2 2 2
# $ q7 : Ord.factor w/ 4 levels "Less than usual"<..: 1 2 2 2 2
# $ q8 : Ord.factor w/ 4 levels "Less than usual"<..: 3 3 3 2 1
# $ q9 : Ord.factor w/ 4 levels "Less than usual"<..: 3 4 4 2 1
# $ q10: Ord.factor w/ 4 levels "Less than usual"<..: 2 4 3 2 1
# $ q11: Ord.factor w/ 4 levels "Less than usual"<..: 2 3 2 2 1
我需要使用两种不同的评分系统来计算整个问卷的总分以及选择问题的两个子量表。第一个分量表由问题 1-7 组成,第二个分量表由问题 8-11 组成。
我如何使用两个计分系统计算这些总数以获得 6 个(子)总数:
total_likert
、total_binary
、total_ss1_likert
、total_ss1_binary
、total_ss2_likert
和 total_ss2_binary
?
您可以首先使用
across
和recode
根据评分系统更新您的值(您可能也想选择replace
),然后使用rowwise
计算每个id的总分:
df %>%
mutate(across(starts_with("q"), ~ recode(.x, "Less than usual" = 0,
"No more than usual" = 1,
"More than usual" = 2,
"Much more than usual" = 3),
.names = "likert_{.col}")) %>%
mutate(across(starts_with("q"), ~ recode(.x, "Less than usual" = 0,
"No more than usual" = 0,
"More than usual" = 1,
"Much more than usual" = 1),
.names = "binary_{.col}")) %>%
rowwise(id) %>% mutate(total_likert = sum(c_across(likert_q1:likert_q11)),
total_ss1_likert = sum(c_across(likert_q1:likert_q7)),
total_ss2_likert = sum(c_across(likert_q8:likert_q11)),
total_binary = sum(c_across(binary_q1:binary_q11)),
total_ss1_binary = sum(c_across(binary_q1:binary_q7)),
total_ss2_binary = sum(c_across(binary_q8:binary_q11))) %>%
select(id, total_likert, total_binary, total_ss1_likert, total_ss1_binary, total_ss2_likert, total_ss2_binary)