小编Sam*_*gar的帖子

data.table中的ifelse赋值

我是一名教师,并希望正确使用该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使用方式ifelsej,特别是如果我们依赖于另一个表?

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: …
Run Code Online (Sandbox Code Playgroud)

r data.table

4
推荐指数
1
解决办法
945
查看次数

标签 统计

data.table ×1

r ×1