(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_correct1
、sr$num_correct2
などに列を作成して、学生が完全に一致したことを示し、他の列には選択された正解の数を示したいと思います...
例: sr$questions2 の学生の行で、の question2 行にもある要素の数ms$c_ans
。ms[[2,4]]
問題は次の 2 つに分かれると思います。
sr$q1_full <- sr[[2]]==ms[[1,3]]
素敵なブール値のベクトルが得られますが、結果は驚くべきものです (意図したとおりに正しくありません) FALSE FALSE FALSE TRUE
。
length(intersect(sr[[1,2]], ms[[1,3]]))
個々の要素に対して機能しますが、sr[2] などのベクトル全体を ms[[1,3]] と比較するにはどうすればよいですか?