如何在R中创建测验得分变量 批量计算多题测验正确率得分
R实现批量测验得分计算的最优方案
可以通过定义答案键的方式实现行值匹配计算得分,该方案不受无关变量、题量大小影响,是当前需求的最优解
方案核心思路
- 构造命名向量作为答案键:键为题目列名,值为对应题目的正确答案,题量多少都可以直接在该向量中补充,无需修改后续计算逻辑
- 通过向量化匹配运算,批量计算每个受试者答对题目数量,再转换为百分比得分
- 仅匹配答案键中指定的题目列,数据集内其他无关字段不会干扰计算
代码实现(tidyverse 版,适配大样本、多题量场景,效率最优)
library(tidyverse) # 示例数据集 example <- tibble(ID = c(1,2,3), age = c(12,12,11), Q1 = c(T,T,T), Q2 = c(F,F,T), Q3 = c(F,T,F)) # 定义答案键,50道题只需补充Q4到Q50的对应正确值即可 answer_key <- c(Q1 = TRUE, Q2 = TRUE, Q3 = FALSE) # 计算得分 result <- example %>% mutate( # 仅匹配答案键中的题目列,计算答对总题数 correct_count = rowSums(across(all_of(names(answer_key))) == answer_key[col(across(all_of(names(answer_key))))]), # 转换为保留1位小数的百分比得分 score = round(correct_count / length(answer_key) * 100, 1) ) %>% select(-correct_count) # 可选择删除中间计算的答对题数字段
代码实现(base R 版)
# 定义答案键 answer_key <- c(Q1 = TRUE, Q2 = TRUE, Q3 = FALSE) quiz_cols <- names(answer_key) # 直接计算得分写入数据集 example$score <- round( rowSums(example[, quiz_cols] == answer_key[col(example[, quiz_cols])]) / length(quiz_cols) * 100, 1 )
输出验证
运行上述代码后得到的结果与预期完全一致:
| ID | age | Q1 | Q2 | Q3 | score |
|---|---|---|---|---|---|
| 1 | 12 | TRUE | FALSE | FALSE | 66.7 |
| 2 | 12 | TRUE | FALSE | TRUE | 33.3 |
| 3 | 11 | TRUE | TRUE | FALSE | 100 |
方案优势
- 扩展性强:题量从3道扩展到50道甚至更多时,仅需更新答案键内容,计算逻辑无需修改
- 抗干扰:仅对答案键指定的题目列做匹配计算,数据集中存在的其他无关变量(如年龄、性别、地区等)不会影响计算结果
- 效率高:采用向量化运算,而非逐行遍历,哪怕受试者样本量过万、题量上百也能快速完成计算
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

