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 (ceci n'est applicable que pour un questionnaire à choix unique). Alternativement, vous pouvez ajouter un troisième argument qui retournera un vecteur numérique avec un score final, ou un fichier data.frame avec un score incorporé.
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. Notez que je ne l'ai pas mis na.rm
l'argument ... Est-ce que faire
# 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 data.frame argument, il retournera data.frame modifié. Je vais essayer de réparer celui-ci ... J'espère que ça aide!
BTW, il y avait un truc sympa avec un timing en réponse Dirk: http://stackoverflow.com/questions/1748590/revolution-for-r/1748932#1748932 – Marek