在r中的多回答多答试题中获得部分学分

在r中的多回答多答试题中获得部分学分,r,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"),

我正在尝试用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))

mydata下面是一种使用
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
>mydata%>%
dplyr::行方式()%>%
dplyr::mutate(分数=长度(相交(strsplit(答案),)[[1]],strsplit(键),)[[1]]))
#一个tibble:5x5
学生问题答案关键分数
1第一季度A广告1
公元前2年第一季度
3第1季度广告2
4第1季度交流广告1
5第1季度BD广告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

所有选项不需要
dplyr::
。只需预先加载
dplyr
,因为这个包对于管道的工作来说是必需的。我喜欢包含它,只是为了明确显示哪些函数来自
dplyr
。例如,
intersect
也由
dplyr
实现,但不需要使用该版本(即使我们也可以,因为他们在本例中做相同的事情)。感谢您花时间研究此问题。我喜欢代码的简单性。然而,它实际上只完成了一半的得分。我试图给他们的思维过程打分。因此,不选择B,例如,当B错误时,也应获得1分。在一个有5个选项的问题上,如果你选择了所有正确的选项(没有错误),你可以得到5分。这有意义吗?有可能吗?@RRL我已经包括了一个更新,我想它会按照你的要求进行评分。这有点复杂,所以如果你想让我澄清任何事情,请告诉我。@C.Braun我认为这应该是复杂的。我只是想不出当R不知道缺少什么的时候,如何告诉它缺少的元素的总分。我从未使用过xor(),您的解决方案看起来仍然非常优雅。我想我必须为每个答案选择一个带有分数的专栏,然后简单地把它们加起来,但仍在努力将它们全部翻译成R。我非常感谢你花时间来帮助我。