Robiłem coś podobnego kilka tygodni temu. Oto możliwe rozwiązanie, zostało napisane od zera, więc jest to wersja beta lub coś w tym rodzaju. Spróbuję to poprawić, usuwając pętle z kodu ...
Głównym pomysłem jest napisanie funkcji, która będzie pobierać 2 (lub 3) argumenty. Pierwsza to, data.frame
która przechowuje dane zebrane z kwestionariusza, a druga to wektor numeryczny z poprawnymi odpowiedziami (dotyczy to tylko kwestionariusza jednokrotnego wyboru). Alternatywnie możesz dodać trzeci argument, który zwróci wektor numeryczny z wynikiem końcowym lub data.frame z osadzonym wynikiem.
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)
}
Postaram się zrobić to w bardziej elegancki sposób z jakąś funkcją * ply. Zauważ, że nie na.rm
argumentowałem ... Zrobię to
# 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))
Teraz zastosuj funkcję:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Jeśli przekażesz argument data.frame, zwróci on zmodyfikowany data.frame. Spróbuję to naprawić ... Mam nadzieję, że to pomoże!
table(c(FALSE))["TRUE"]
daje NA, a nie 0.