J'ai fait quelque chose de similaire il y a quelques semaines. Voici une solution possible, elle est écrite à partir de zéro, donc c'est une sorte de beta-release ou quelque chose comme ça. Je vais essayer de l'améliorer en supprimant les boucles du code...
L'idée principale est d'écrire une fonction qui prendra 2 (ou 3) arguments. Le premier est un data.frame
qui contient les données recueillies dans le questionnaire, et le second est un vecteur numérique avec les réponses correctes (ceci n'est applicable que pour les questionnaires à choix unique). Vous pouvez également ajouter un troisième argument qui renverra un vecteur numérique avec le score final, ou un data.frame avec le score intégré.
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)
}
Je vais essayer de le faire d'une manière plus élégante avec une fonction *ply. Remarquez que je n'ai pas mis na.rm
argument... Je le ferai.
# 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))
Maintenant, appliquez une fonction :
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Si vous passez l'argument data.frame, il retournera le data.frame modifié. Je vais essayer de corriger cela... J'espère que cela vous aidera !