He estado haciendo algo similar hace unas semanas. Aquí hay una posible solución, está escrita desde cero, por lo que es una especie de versión beta o algo así. Intentaré mejorarlo eliminando bucles del código ...
La idea principal es escribir una función que tome 2 (o 3) argumentos. El primero es el data.frameque contiene los datos recopilados del cuestionario, y el segundo es un vector numérico con respuestas correctas (esto solo es aplicable para el cuestionario de opción única). Alternativamente, puede agregar un tercer argumento que devolverá un vector numérico con puntaje final o data.frame con puntaje incrustado.
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)
}
Intentaré hacer esto de una manera más elegante con alguna función * pliegue. Tenga en cuenta que no puse na.rmargumento ... Hará eso
# 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))
Ahora aplique una función:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Si pasa el argumento data.frame, devolverá data.frame modificado. Trataré de arreglar esto ... ¡Espero que ayude!
table(c(FALSE))["TRUE"]da NA, no 0.