Ich habe vor ein paar Wochen etwas ähnliches getan. Hier ist eine mögliche Lösung, es wurde von Grund auf neu geschrieben, also ist es eine Art Beta-Release oder so ähnlich. Ich werde versuchen, es zu verbessern, indem Schleifen von Code ...
Die Hauptidee zu schreiben, ist eine Funktion zu entfernen, die 2 (oder 3) Argumente nehmen. Die erste ist eine data.frame
, die die Daten aus dem Fragebogen enthält, und die zweite ist ein numerischer Vektor mit korrekten Antworten (dies gilt nur für Single-Choice-Fragebogen). Alternativ können Sie ein drittes Argument hinzufügen, das den numerischen Vektor mit dem Endergebnis oder data.frame mit eingebettetem Ergebnis zurückgibt.
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)
}
Ich werde versuchen, dies auf eine elegantere Weise mit etwas * ply-Funktion zu tun. Beachten Sie, dass ich nicht na.rm
Argument habe setzen ... Mach ich, dass
# 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))
nun eine Funktion anwenden:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Wenn Sie data.frame Argument übergeben, wird es geändert data.frame zurück. Ich werde versuchen, dieses zu beheben ... Hoffe es hilft!
BTW, war es ein schöner Trick mit dem Timing in Dirk Antwort: http://stackoverflow.com/questions/1748590/revolution-for-r/1748932#1748932 – Marek