我正在尝试使用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; =比较类型,这对我的问题不起作用。
我非常感谢您提供的任何帮助。提前谢谢!
答案 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