R:简化代码以将字母等级转换为数字等级

标签 r

我已经在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/

相关文章:

r - dplyr - ifelse 在 mutate using list 中

r - 如何用组/子集的平均值替换NA?

r - 如何根据列值条件选择行

r - 如何检查文件名在R中是否可写?

regex - 取出strsplit中的元素并放入dataFrame

r - dbplyr::collapse 函数的用途

regex - R中是否有用于正则表达式的原始字符串?

r - 根据r中的开始时间和结束时间计算白天和晚上的小时数

r - 如何在 R 中使用 multinom() 进行预测

r - 安装具有 CRAN 镜像依赖项的本地 R 包