我已经在R中编写了一个函数,该函数会将包含字母等级的数据框转换为数字等级。然后,我在数据框的每一列上使用sapply()。有没有一种更简单的方法,不需要三个单独的sapply调用?有没有一种方法可以将功能应用于数据帧的每个元素,而不是每个行或列?
源数据“等级”如下所示:
grades <- read.table("Grades.txt", header = TRUE)
head(grades)
final_exam quiz_avg homework_avg
1 C A A
2 C- B- A
3 D+ B+ A
4 B+ B+ A
5 F B+ A
6 B A- A
我的“
convert_grades
”函数如下所示:convert_grades <- function(x) {
if (x == "A+") {
x <- 4.3
} else if (x == "A") {
x <- 4
} else if (x == "A-") {
x <- 3.7
} else if (x == "B+") {
x <- 3.3
} else if (x == "B") {
x <- 3
} else if (x == "B-") {
x <- 2.7
} else if (x == "C+") {
x <- 2.3
} else if (x == "C") {
x <- 2
} else if (x == "C-") {
x <- 1.7
} else if (x == "D+") {
x <- 1.3
} else if (x == "D") {
x <- 1
} else if (x == "D-") {
x <- 0.7
} else if (x == "F") {
x <- 0
} else {
x <- NA
}
return(x)
}
我当前的方法如下:
num_grades <- grades
num_grades[, 1] <- sapply(grades[, 1], convert_grades)
num_grades[, 2] <- sapply(grades[, 2], convert_grades)
num_grades[, 3] <- sapply(grades[, 3], convert_grades)
head(num_grades)
final_exam quiz_avg homework_avg
1 2.0 4.0 4
2 1.7 2.7 4
3 1.3 3.3 4
4 3.3 3.3 4
5 0.0 3.3 4
6 3.0 3.7 4
最佳答案
我将重写您的convert_grades
函数,如下所示:
convert_grades <- function(x) {
A <- factor(x, levels=c("A+", "A", "A-",
"B+", "B", "B-",
"C+", "C", "C-",
"D+", "D", "D-", "F"))
values <- c(4.3, 4, 3.7,
3.3, 3, 2.7,
2.3, 2, 1.7,
1.3, 1, 0.7, 0)
values[A]
}
然后,我将执行以下转换:
num_grades <- grades
num_grades[] <- lapply(num_grades, convert_grades)
num_grades
final_exam quiz_avg homework_avg
1 2.0 4.0 4
2 1.7 2.7 4
3 1.3 3.3 4
4 3.3 3.3 4
5 0.0 3.3 4
6 3.0 3.7 4
关于R:简化代码以将字母等级转换为数字等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746508/