Ich habe vor ein paar Wochen etwas Ähnliches gemacht. Hier ist eine mögliche Lösung, die von Grund auf neu geschrieben wurde. Es handelt sich also um eine Art Beta-Version oder ähnliches. Ich werde versuchen, es zu verbessern, indem ich Schleifen aus dem Code entferne ...
Die Hauptidee besteht darin, eine Funktion zu schreiben, die 2 (oder 3) Argumente akzeptiert. Die erste ist eine data.frame, die die aus dem Fragebogen gesammelten Daten 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 einen numerischen Vektor mit der endgültigen Bewertung oder data.frame mit der eingebetteten Bewertung 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 elegantere Weise mit einer * Ply-Funktion zu tun. Beachten Sie, dass ich kein na.rmArgument vorgebracht habe ... Ich werde das tun
# 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))
Wenden Sie nun eine Funktion an:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Wenn Sie das Argument data.frame übergeben, wird das geänderte data.frame zurückgegeben. Ich werde versuchen, dieses Problem zu beheben ... Hoffe, es hilft!
table(c(FALSE))["TRUE"]gibt NA, nicht 0.