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í. Trataré de mejorarlo eliminando bucles del código ...
La idea principal es escribir una función que tomará 2 (o 3) argumentos. El primero es un data.frame
que contiene los datos recopilados del cuestionario, y el segundo es un vector numérico con respuestas correctas (esto solo se aplica al cuestionario de opción única). Alternativamente, puede agregar un tercer argumento que devolverá el 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)
}
Trataré de hacer esto de una manera más elegante con alguna función * ply. Tenga en cuenta que no puse na.rm
argumento ... lo hará
# 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 aplicar una función:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Si pasa hoja.de.datos argumento, se volverá hoja.de.datos modificado. Voy a tratar de arreglar este ... ¡Espero que ayude!
Por cierto, había un buen truco con el tiempo en respuesta a Dirk: http://stackoverflow.com/questions/1748590/revolution-for-r/1748932#1748932 – Marek