2016-10-28 12 views
4

私は先生です。Rdata.tableパッケージを正しく使用して、生徒の回答を自動的にログファイルに格付けします。具体的に質問に答えた場合はcorrectという列を追加してください。その質問に対する正解であり、そうでない場合は0です。それぞれの質問は1つだけの答えを持っている場合、私は簡単にこれを行うことができますが、私は質問が複数の可能な答えを持っている場合(質問とその可能正解は別のテーブルに格納されている)までつまずい取得しています以下はifelse assignment in data.table

は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)) 

私の質問は、私たちが別のテーブルに依存している場合は特に、jifelseを使用する正しいdata.table方法は何かにありますか?

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 

私はquestion_tableとINGのjoinによってlogテーブル内の正しいANSとヘルパーの列を作ると考えられますが、キーは、後者では一意ではないので、それは動作しません。

何かすべてのヘルプは高く評価されます。 ありがとうございます。

答えて

6

ジョイン使用することができます。

# 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]です:COL名はXY間で異なる

  • 場合は、バージョン1.9.7+、.(xcol = ycol, xcol2 = ycol2)で、on=c(xcol = "ycol", xcol2 = "ycol2")を使用しますか。
  • xvar := zは、一致するXの行でのみ動作します。場合によっては、by=.EACHIを使用すると便利です。Xの行数はそれぞれYに一致し、zの式はどれほど複雑ですかによって異なります。

構文の詳細については、?data.tableを参照してください。

+0

すぐにお返事ありがとうございます!あなたは構文を説明することができるでしょうか?私は何度も 'data.table'の' join'に[this](https://rstudio-pubs-static.s3.amazonaws.com/52230_5ae0d25125b544caab32f75f0360e775.html)の投稿を読んだことがありますが、あなたの答え、キーのアイデアや 'i'、' j'、 'by'、':= '表記へのリンクはありません。または、少なくとも、推論を説明する他のドキュメントを教えてください。 –

+0

@Sameer良い質問です。ジョインに関する公式のビネットはまだ出ていません。https://github.com/Rdatatable/dataの新しいドキュメントと一緒にそれを追跡できます。table/issues/944現在リリースされているvignettesとFAQは、ここにあります:https://github.com/Rdatatable/data.table/wiki/Getting-startedその間、私はここにいくつかの注釈があります:http://stackoverflow.com /documentation/data.table/4976/joins-and-merges#t=201610291315481350706 Arunが説明しているように、あなたがリンクしているブログは古く、キーはほとんど必要ありません: – Frank

+1

vignettesは出力されていませんが、マニュアルは非常によくカバーしています。例えば、[?data.table](http://jangorecki.gitlab.io/data.table/library/data.table/html/data.table.html)を参照してください。 – jangorecki