在r中的多回答多答试题中获得部分学分
我正在尝试用r为多项选择题评分。我想在我的数据框中用分数创建一个单独的列。分数取决于学生做出了多少正确和错误的选择。例如,如果选择A和D给出正确答案,而学生回答AB,则分数为+1-1+1-1+1=1。基本上每个正确的选择+1,每个错误的选择-1。在这个评分方案中,当E不正确时不选择E是正确的选择 以下是我的数据帧的示例:在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"),
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。我非常感谢你花时间来帮助我。