Ho fatto qualcosa di simile qualche settimana fa. Ecco una possibile soluzione, è scritta da zero, quindi è una sorta di beta-release o qualcosa del genere. Proverò a migliorarlo rimuovendo i loop dal codice ...
L'idea principale è scrivere una funzione che richiederà 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 (applicabile solo per il questionario a scelta singola). In alternativa, è possibile aggiungere un terzo argomento che restituirà un vettore numerico con punteggio finale o data.frame con 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)
}
Cercherò di farlo in un modo più elegante con alcune funzioni * ply. Si noti che non ho messo na.rm
argomento ... 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 applicare una funzione:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Se si passa data.frame argomento, tornerà data.frame modificato. Proverò a sistemare questo ... Spero che aiuti!
A proposito, c'era un bel trucco con temporizzazione in Dirk risposta: http://stackoverflow.com/questions/1748590/revolution-for-r/1748932#1748932 – Marek