在r中的多重答案多答案考试问题中获得部分学分

时间:2018-02-14 23:06:17

标签: r

我正在尝试使用r对多重响应多项选择题考试。我想在我的数据框中用分数创建一个单独的列。得分取决于学生做出的正确和错误选择。例如,如果选择A& D,并且学生回答AB,分数将是+ 1-1 + 1-1 + 1 = 1.每个正确选择基本上+1,每个错误选择-1。在这个评分方案中,当E不正确时不选择E构成正确的选择。

以下是我的数据框的示例:

 mydata <- structure(list(Student = 1:5, Question = c("Q1", "Q1", "Q1", "Q1", "Q1"), 
                     Answer = c("A", "BC", "AD", "AC", "BD"), 
                     Key = c("AD", "AD", "AD", "AD", "AD")),
                     .Names = c("Student", "Question", "Answer", "Key"), 
                     class = "data.frame", row.names = c(NA, -5L))

我无法弄清楚如何告诉r比较两列(“答案”和“键”),识别两者中存在或不存在的字母,为每个迭代分配一个值(A列出现在两列中,A两列都不存在,B存在于两列中,依此类推......),然后添加这些值。

或者,每个单独的计算(A列出现在两列中,A不存在于两列中,B存在于两列中,依此类推......)可以放在其自己的列中,并且可以简单地计算总和。 / p>

我搜索过这么多帖子,但找不到类似的问题。大多数帖子都比较数字列并使用&gt;&lt; =比较类型,这对我的问题不起作用。

我非常感谢您提供的任何帮助。提前谢谢!

1 个答案:

答案 0 :(得分:2)

以下是使用dplyr对答案进行评分的可能方法:

> mydata %>% 
  dplyr::rowwise() %>% 
  dplyr::mutate(score = length(intersect(strsplit(Answer, '')[[1]], strsplit(Key, '')[[1]])))

# A tibble: 5 x 5
  Student Question Answer Key   score
  <int> <chr>    <chr>  <chr> <int>
1       1 Q1       A      AD        1
2       2 Q1       BC     AD        0
3       3 Q1       AD     AD        2
4       4 Q1       AC     AD        1
5       5 Q1       BD     AD        1

这是另一种解释每个正确或错误选择的+ 1 / -1的方法。因为没有办法知道所有可能的选择只来自数据,所以你必须具体包括这一点。

all_choices <- c('A', 'B', 'C', 'D', 'E')
for(choice in all_choices) {
   mydata[ , choice] <- 1 + xor(grepl(choice, mydata$Answer), grepl(choice, mydata$Key)) * -2
}
mydata$score <- rowSums(mydata[ , all_choices])

> mydata
  Student Question Answer Key  A  B  C  D E score
1       1       Q1      A  AD  1  1  1 -1 1     3
2       2       Q1     BC  AD -1 -1 -1 -1 1    -3
3       3       Q1     AD  AD  1  1  1  1 1     5
4       4       Q1     AC  AD  1  1 -1 -1 1     1
5       5       Q1     BD  AD -1 -1  1  1 1     1