0

(R, dplyr) 生徒の MCQ の回答と正解を入力して、点数を計算しようとしています。多くの質問には複数の回答があります。マークシートの回答 ( ms) と生徒の回答 ( sr) をデータフレームとして入力しました。列ベクトルはリストです。(更新: 質問のラベルは の行名ですms。)

sr の各列の行を ms の関連する回答列と比較して見つける最善の方法を試みます: 1. 選択された正解の数と 2. 完全一致かどうか。

個々の要素をlength(intersect(sr[[1,2]], ms[[3,2]]))コマンドで比較できますが、これをスケールアップする方法がわかりません...反復またはpurr、mutate_atなどを使用します.

#Sample of the data frame

#Input
ms <- tribble( #mark scheme
  ~q_label, ~point_value,   ~d_partial_credit,  ~c_ans,
  "questions1", 5,  1,  "B,E",
  "questions2", 4,  0,  "C",
  "questions3", 4,  1,  "C,E"
)

ms <- ms %>% remove_rownames %>% column_to_rownames(var="names")


sr <- tribble( #student responses 
~id,    ~questions1,    ~questions2,    ~questions3,
"1", "A,E", "C", "C,B",
"2",    "A,D,E","B","C,E",
"3",    "E",    "C",    "A,B,C",
"4", "E",   "C",    "C"
)

回答列を「文字のリスト」再帰ベクトルに変換します: ms$c_ans <- lapply(strsplit(as.character(ms$c_ans),split=','),trimws)

makeitlist <- function(x) (lapply(strsplit(as.character(x),split=','),trimws))
for (i in 2:length(sr)) {          
  sr[[i]] <- makeitlist(sr[[i]]) 
}

今、私は sr... sr$num_correct1sr$num_correct2などに列を作成して、学生が完全に一致したことを示し、他の列には選択された正解の数を示したいと思います...

例: sr$questions2 の学生の行で、の question2 行にもある要素の数ms$c_ansms[[2,4]]

問題は次の 2 つに分かれると思います。

  1. sr$q1_full <- sr[[2]]==ms[[1,3]]

素敵なブール値のベクトルが得られますが、結果は驚くべきものです (意図したとおりに正しくありません) FALSE FALSE FALSE TRUE

  1. length(intersect(sr[[1,2]], ms[[1,3]]))

個々の要素に対して機能しますが、sr[2] などのベクトル全体を ms[[1,3]] と比較するにはどうすればよいですか?

4

1 に答える 1