Eu venho fazendo algo semelhante há algumas semanas atrás. Aqui está uma solução possível, que foi escrita do zero, portanto é uma versão beta ou algo parecido. Vou tentar melhorá-lo removendo loops do código ...
A idéia principal é escrever uma função que aceite 2 (ou 3) argumentos. O primeiro é aquele data.frame
que contém os dados coletados no questionário e o segundo é um vetor numérico com respostas corretas (isso só é aplicável ao questionário de escolha única). Como alternativa, você pode adicionar o terceiro argumento que retornará o vetor numérico com a pontuação final ou data.frame com a pontuação incorporada.
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)
}
Vou tentar fazer isso de uma maneira mais elegante com alguma função * dobra. Observe que eu não coloquei na.rm
argumento ... Farei isso
# 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))
Agora aplique uma função:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Se você passar o argumento data.frame, ele retornará data.frame modificado. Vou tentar consertar este ... Espero que ajude!
table(c(FALSE))["TRUE"]
dá NA, não 0.