Я делал нечто подобное несколько недель назад. Вот возможное решение, оно написано с нуля, так что это своего рода бета-релиз или что-то в этом роде. Я постараюсь улучшить его, удалив циклы из кода ...
Основная идея - написать функцию, которая будет принимать 2 (или 3) аргумента. Первый - это data.frame
данные, собранные из вопросника, а второй - числовой вектор с правильными ответами (это применимо только к вопроснику с одним выбором). В качестве альтернативы, вы можете добавить третий аргумент, который будет возвращать числовой вектор с окончательной оценкой, или data.frame со встроенной оценкой.
fscore <- function(x, sol, output = 'numeric') {
if (ncol(x) != length(sol)) {
stop('Number of items differs from length of correct answers!')
} else {
inc <- matrix(ncol=ncol(x), nrow=nrow(x))
for (i in 1:ncol(x)) {
inc[,i] <- x[,i] == sol[i]
}
if (output == 'numeric') {
res <- rowSums(inc)
} else if (output == 'data.frame') {
res <- data.frame(x, result = rowSums(inc))
} else {
stop('Type not supported!')
}
}
return(res)
}
Я попытаюсь сделать это более элегантно с помощью функции * ply. Обратите внимание, что я не поставил na.rm
аргумент ... Сделаю это
# create dummy data frame - values from 1 to 5
set.seed(100)
d <- as.data.frame(matrix(round(runif(200,1,5)), 10))
# create solution vector
sol <- round(runif(20, 1, 5))
Теперь примените функцию:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Если вы передадите аргумент data.frame, он вернет измененный data.frame. Я постараюсь исправить это ... Надеюсь, это поможет!
table(c(FALSE))["TRUE"]
дает NA, а не 0.