Saya telah melakukan sesuatu yang serupa beberapa minggu yang lalu. Inilah solusi yang mungkin, ini ditulis dari awal, jadi ini semacam rilis beta atau semacamnya. Saya akan mencoba memperbaikinya dengan menghapus loop dari kode ...
Gagasan utamanya adalah menulis fungsi yang akan mengambil 2 (atau 3) argumen. Yang pertama adalah data.frameyang menyimpan data yang dikumpulkan dari kuesioner, dan yang kedua adalah vektor numerik dengan jawaban yang benar (ini hanya berlaku untuk kuesioner pilihan tunggal). Atau, Anda bisa menambahkan argumen ketiga yang akan mengembalikan vektor numerik dengan skor akhir, atau data.frame dengan skor tertanam.
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)
}
Saya akan mencoba melakukan ini dengan cara yang lebih elegan dengan beberapa fungsi * ply. Perhatikan bahwa saya tidak mengajukan na.rmargumen ... Akan melakukan itu
# 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))
Sekarang terapkan fungsi:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Jika Anda melewatkan argumen data.frame, itu akan mengembalikan data.frame yang dimodifikasi. Saya akan mencoba untuk memperbaiki ini ... Semoga ini bisa membantu!
table(c(FALSE))["TRUE"]memberi NA, bukan 0.