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.rm
Argument 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.