J'ai fait quelque chose de similaire il y a quelques semaines. Voici une solution possible, c'est écrit à partir de zéro, donc c'est une sorte de version bêta 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 à partir du questionnaire, et le second est un vecteur numérique avec des réponses correctes (cela n'est applicable que pour le questionnaire à choix unique). Vous pouvez également ajouter un troisième argument qui renverra un vecteur numérique avec le score final, ou data.frame avec un 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 na.rm
argumenté ...
# 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 renverra data.frame modifié. Je vais essayer de réparer celui-ci ... J'espère que cela aide!
table(c(FALSE))["TRUE"]
donne NA, pas 0.