Tôi đã làm một cái gì đó tương tự một vài tuần trước. Đây là một giải pháp khả thi, nó được viết từ đầu, vì vậy đây là loại phát hành beta hoặc đại loại như thế. Tôi sẽ cố gắng cải thiện nó bằng cách loại bỏ các vòng lặp khỏi mã ...
Ý tưởng chính là viết một hàm sẽ lấy 2 (hoặc 3) đối số. Đầu tiên là một data.frame
dữ liệu chứa dữ liệu được thu thập từ bảng câu hỏi và cái thứ hai là một vectơ số có câu trả lời đúng (điều này chỉ áp dụng cho bảng câu hỏi lựa chọn duy nhất). Ngoài ra, bạn có thể thêm đối số thứ ba sẽ trả về vectơ số với điểm số cuối cùng hoặc data.frame với điểm số được nhúng.
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)
}
Tôi sẽ cố gắng làm điều này một cách tao nhã hơn với một số chức năng * ply. Lưu ý rằng tôi đã không đưa ra na.rm
lập luận ... Sẽ làm điều đó
# 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))
Bây giờ áp dụng một chức năng:
> fscore(d, sol)
[1] 6 4 2 4 4 3 3 6 2 6
Nếu bạn truyền đối số data.frame, nó sẽ trả về data.frame đã sửa đổi. Tôi sẽ cố gắng sửa cái này ... Hy vọng nó có ích!
table(c(FALSE))["TRUE"]
cho NA, không phải 0.