当前位置: 首页 > 知识库问答 >
问题:

data.table 中的 ifelse 赋值

濮阳旺
2023-03-14

我是一名教师,希望正确使用<code>数据。表在<code>R

以下是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))

我的问题在于什么是正确的数据。表在<code>j,特别是当我们依赖另一个表时?

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

虽然正确的列计算无误,但还是有些地方不对:例如,当< code >学生b回答问题时,他得到了正确的分数,尽管他回答错误。只有< code>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

我考虑过通过< code > join with < code > question _ table 在< code>log表中使用正确的ans创建一个帮助器列,但这并不可行,因为后者中的键不是唯一的。

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

共有1个答案

祁杰
2023-03-14

您可以使用联接:

# 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]

    < li >如果< code>X和< code>Y之间的列名不同,请使用< code>on=c(xcol = "ycol ",xcol2 = "ycol2")或在版本1.9.7中使用< code >。(xcol = ycol,xcol2 = ycol2)。 < li> xvar := z只对匹配的< code>X行进行操作。有时,通过=使用< code >也很有用。每个在这里,取决于在< code>Y中每个匹配多少行< code>X,以及< code>z的表达式有多复杂。

请参阅<代码>?数据有关语法的完整文档,请参见表。

 类似资料:
  • 我正在研究一个数据帧(昏暗: 10,155乘33)。几排 对于变量age_band,我想使用tidyverse函数separate(),mutate() 将年龄段分成两列a1 我正在使用以下代码: 错误:列必须是长度10155(行数)或1,而不是0请建议可以做什么。当我在ifelse语句中运行没有'$'的代码时,我得到一个错误对象'a1'没有找到,而通常,我们在使用链接运算符时不需要'$' 也是

  • 我有数据。下表 我想按组查找每列中唯一值的总和。 我尝试了以下内容,它给了我每列中所有值的总和(但不是唯一值)。 然而,我只想找到唯一值的和。 答案应该是这样的- 谢谢

  • 我用R编写了以下代码,效果很好。但是,假设我必须对具有多个级别的因子变量应用类似的代码(

  • 我试图更多地理解滚动加入的工作方式,并有一些困惑,我希望有人能为我澄清这一点。举一个具体的例子: 我希望这会生成一个长的,其中滚动中的值: 另外,文档中说: 这使得看起来只有X中的东西应该返回,而正在执行的联接是内部联接,而不是外部联接。如果,但是中不存在特定的呢?再玩一点,我不明白列中有什么值。

  • 很多从 Java、C 语言转向 Python 的程序员对 Python 中的赋值语句感到很神奇或者很困惑, Python 中赋值的特殊之处有 3 点特殊之处:出 0-127 的数字、部分字符串外都是引用赋值; 和其它支持函数式编程范式的语言一样,支持模式匹配;Python 支持连续赋值。 模式匹配 支持函数式编程范式的语言通常也支持模式匹配,例如在 Erlang 中我可以这样赋值: [Head |

  • 与数据帧相比,我对使用< code>data.table的< code>tapply类操作的速度提升印象极为深刻。 例如: 然而,我并没有完全设法让它比类操作中的数据帧工作得更快(即,需要将函数应用于每一行的情况)。 这真的只是意料之中还是有一些技巧?