我是一名教师,并希望正确使用该data.table软件包在R日志文件中自动评分学生答案,即correct如果学生回答某个特定问题,则添加一个列,该答案是该问题的正确答案,否则为0.如果每个问题只有一个答案,我可以很容易地做到这一点,但如果一个问题有多个可能的答案(问题及其可能的正确答案存储在另一个表中),我会被绊倒
以下是MWE:
set.seed(123)
question_table <- data.table(id=c(1,1,2,2,3,4),correct_ans=sample(1:4,6,replace = T))
log <- data.table(student=sample(letters[1:3],10,replace = T),
question_id=c(1,1,1,2,2,2,3,3,4,4),
student_answer= c(2,4,1,3,2,4,4,5,2,1))
Run Code Online (Sandbox Code Playgroud)
我的问题出在什么是正确的data.table使用方式ifelse中j,特别是如果我们依赖于另一个表?
log[,correct:=ifelse(student_answer %in%
question_table[log$question_id %in% id]$correct_ans,1,0)]
Run Code Online (Sandbox Code Playgroud)
如下所示,问题1和2都有多个可能的正确答案.
> question_table
id correct_ans
1: 1 2
2: 1 4
3: 2 2
4: 2 4
5: 3 4
6: 4 1
Run Code Online (Sandbox Code Playgroud)
虽然正确的列是在没有错误的情况下计算出来的,但有些事情是不对的:例如,当student b答案有问题时,即使答案不正确,他也会获得正确的分数.只有correct列的一些条目是关闭的,这使我相信有些东西我没有得到变量的作用域.
> log
student question_id student_answer correct
1: b 1 2 1
2: c 1 4 1
3: b 1 1 1 <- ?
4: b 2 3 0
5: c 2 2 1
6: b 2 4 1
7: c 3 4 1
8: b 3 5 0
9: a 4 2 1 <- ?
10: c 4 1 1
Run Code Online (Sandbox Code Playgroud)
我考虑做与在正确的答一个辅助列log由表join与荷兰国际集团question_table,但是,这并不工作,因为关键不在于后者是独一无二的.
任何和所有的帮助将不胜感激.提前致谢.
您可以使用联接:
# initialize to zero
log[, correct := 0L ]
# update to 1 if matched
log[question_table, on=c(question_id = "id", student_answer = "correct_ans"),
correct := 1L ]
student question_id student_answer correct
1: b 1 2 1
2: c 1 4 1
3: b 1 1 0
4: b 2 3 0
5: c 2 2 1
6: b 2 4 1
7: c 3 4 1
8: b 3 5 0
9: a 4 2 0
10: c 4 1 1
Run Code Online (Sandbox Code Playgroud)
这个怎么运作.更新连接的语法是X[Y, on=cols, xvar := z]:
X和之间不同Y,请使用on=c(xcol = "ycol", xcol2 = "ycol2")或在版本1.9.7 +中,.(xcol = ycol, xcol2 = ycol2).xvar := z只会对X匹配的行进行操作.有时,by=.EACHI在这里使用它也很有用,具体取决于X每个行匹配的行数Y以及表达式的复杂z程度.有关?data.table语法的完整文档,请参阅.
| 归档时间: |
|
| 查看次数: |
945 次 |
| 最近记录: |