Ho fatto qualcosa di simile alcune settimane fa. Ecco una possibile soluzione, è stata scritta da zero, quindi è una specie di versione beta o qualcosa del genere. Proverò a migliorarlo rimuovendo i loop dal codice ...
L'idea principale è quella di scrivere una funzione che prenderà 2 (o 3) argomenti. Il primo è uno data.frame
che contiene i dati raccolti dal questionario, e il secondo è un vettore numerico con risposte corrette (questo è applicabile solo al questionario a scelta singola). In alternativa, puoi aggiungere un terzo argomento che restituirà il vettore numerico con il punteggio finale o data.frame con il punteggio incorporato.
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)
}
Proverò a farlo in un modo più elegante con qualche funzione * ply. Nota che non ho messo in na.rm
discussione ... Lo farò
# 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))
Ora applica una funzione:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Se si passa l'argomento data.frame, verrà restituito data.frame modificato. Proverò a risolvere questo ... Spero che sia d'aiuto!
table(c(FALSE))["TRUE"]
dà NA, non 0.