Эффективный способ оценки двух тестов в таблице R data.table - PullRequest
1 голос
/ 08 мая 2020

Предположим, у меня есть следующая таблица данных с ответами на два разных теста, red и blue:

library(data.table)
dt <- data.table(
  class = rep("math", 4),
  test = c("red", "red", "blue", "red"),
  student = 1:4,
  q1_answer = c("a", "a", "b", "a"),
  q2_answer = c("b", "c", "b", NA),
  q3_answer = c("c", "c", "c", NA)
)
# dt
#   class test student q1_answer q2_answer q3_answer
#1:  math  red       1         a         b         c
#2:  math  red       2         a         c         c
#3:  math blue       3         b         b         c
#4:  math  red       4         a      <NA>      <NA>

Ключи ответов для тестов blue и red - это следующее:

red_answer_key <- c("a", "b", "c")
blue_answer_key <- c("b", "c", "d")

Как мне получить баллы по двум тестам, чтобы в следующей таблице был столбец score?

#   class test student q1_answer q2_answer q3_answer score
#1:  math  red       1         a         b         c     3
#2:  math  red       2         a         c         c     2
#3:  math blue       3         b         b         c     1
#4:  math  red       4         a      <NA>      <NA>     1  # count NA as incorrect

1 Ответ

1 голос
/ 08 мая 2020

Один вариант:

key_list <- list(
  red = red_answer_key,
  blue = blue_answer_key
)
dt_long <- dt[, melt(.SD, id.vars = c("class", "test", "student"))]
dt_scores <- dt_long[, .(score = sum(value == key_list[[test]])), keyby = .(student, test)]
# Join back inz
dt[, score := dt_scores[.SD, on = .(student, test), score]]

#    class test student q1_answer q2_answer q3_answer score
# 1:  math  red       1         a         b         c     3
# 2:  math  red       2         a         c         c     2
# 3:  math blue       3         b         b         c     1
# 4:  math  red       4         a      <NA>      <NA>    NA
...