gpt4 book ai didi

r - data.table 中的 ifelse 赋值

转载 作者:行者123 更新时间:2023-12-05 00:17:27 25 4
gpt4 key购买 nike

我是老师,想正确使用data.table包裹在 R在日志文件中自动给学生的答案评分,即添加一个名为 correct 的列如果学生回答特定问题,则为该问题的正确答案,否则为 0。如果每个问题只有 1 个答案,我可以轻松做到这一点,但是如果一个问题有多个可能的答案(问题及其可能的正确答案存储在另一个表中),我就会被绊倒

下面是一个 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))

我的问题在于什么是正确的 data.table使用方法 ifelsej ,特别是如果我们依赖另一个表?
log[,correct:=ifelse(student_answer %in% 
question_table[log$question_id %in% id]$correct_ans,1,0)]

如下所示,问题 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

虽然计算出正确的列没有错误,但有些地方是不对的:例如当 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

我考虑在 log 中使用正确的 ans 制作一个辅助列表来自 joinquestion_table 一起,但这不起作用,因为 key 在后者中不是唯一的。

任何和所有帮助将不胜感激。
提前致谢。

最佳答案

您可以使用连接:

# 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

这个怎么运作。更新连接的语法是 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有关语法的完整文档。

    关于r - data.table 中的 ifelse 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40314562/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com