Я робив щось подібне кілька тижнів тому. Ось можливе рішення, воно написане з нуля, тому це свого роду бета-реліз чи щось подібне. Я спробую покращити його, видаливши цикли з коду ...
Основна ідея - написати функцію, яка прийме 2 (або 3) аргументи. Перший - це data.frame
вміст даних, зібраних з анкети, а другий - числовий вектор з правильними відповідями (це стосується лише опитувальника з одним вибором). Крім того, ви можете додати третій аргумент, який повертає числовий вектор з кінцевою оцінкою, або data.frame з вбудованою шкалою.
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)
}
Я спробую це зробити більш елегантним чином з деякою функцією * ply. Зверніть увагу, що я не став na.rm
аргументувати ... Зробимо це
# 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))
Тепер застосуйте функцію:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Якщо ви передасте аргумент data.frame, він поверне змінені data.frame. Я спробую виправити це ... Сподіваюся, це допомагає!
table(c(FALSE))["TRUE"]
дає НА, а не 0.