从应用于存储为因素的数据的评分系统中计算“总”变量

问题描述 投票:0回答:1

我在 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 组成。

  • 第一个评分系统(李克特)分别为因子水平分配值 0、1、2 和 3。
  • 第二个评分系统(二进制)分别赋值0、0、1和1。

我如何使用两个计分系统计算这些总数以获得 6 个(子)总数:

total_likert
total_binary
total_ss1_likert
total_ss1_binary
total_ss2_likert
total_ss2_binary

r tidyverse categorical-data
1个回答
0
投票

您可以首先使用

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)
© www.soinside.com 2019 - 2024. All rights reserved.