无法将列条目从成绩(字符串)更改为数值 (GPA)

Cannot change column entries from grades (strings) into numeric values (GPA)

我有一个 CSV 文件,其中 'Grade' 列包含从 'F' 和 'D+' 到 'A' 的条目(成绩)(不是 'A+'尽管)。所以,我想做的是将这些值从 'A' 转换为 4.0(数值),'A-' 转换为 3.7(再次 - 数字)。

到目前为止,我尝试了 plyr 库中的 revalue(),但没有成功。

     filtered_data$Grade <- 
        as.numeric(as.character(revalue(filtered_data$Grade, 
        +                                   c("A"="4.0", "A-"="3.7",
        +                                     "B+" = "3.3", "B" = "3.0",
        +                                     "B-" = "2.7", "C+" = "2.3",
        +                                     "C" = "2.0", "C-" = "1.7",
        +                                     "D+" = "1.3", "D" = "1.0",
        +                                     "F" = "0.0"))))
        Error in revalue(filtered_data$Grade, c(A = "4.0", `A-` = "3.7", 
        `B+` = "3.3",  : 
        x is not a factor or a character vector.

我也尝试用 as.numeric(as.character(foo)) 做一些技巧,但效果不佳。

第三,'hardcoding' 方法,效果不佳,因为我试图实现 for 循环 来更改列中的每个条目,但我收到了这条消息

    Warning message:
    In `[<-.factor`(`*tmp*`, i, value = c(11L, 16L, 5L, 13L, 8L, 16L,  :
     invalid factor level, NA generated

提前致谢!

将“成绩”列更改为一个因素即可使用第一种方法:

filtered_data<-data.frame(Grade=c("A","B+", "C", "A-","D","B", "B-","C+","C-","D+","F"))
filtered_data$Grade <- as.factor(filtered_data$Grade)

filtered_data$Grade <- revalue(filtered_data$Grade, 
   c("A"="4.0", "A-"="3.7",
     "B+" = "3.3", "B" = "3.0",
     "B-" = "2.7", "C+" = "2.3",
     "C" = "2.0", "C-" = "1.7",
     "D+" = "1.3", "D" = "1.0",
     "F" = "0.0"))

我不确定您的错误发生在哪里,但我认为使用查找向量的方法比请求新包和函数要简单得多:

> trans.vec=  c("A"="4.0", "A-"="3.7",
+    "B+" = "3.3", "B" = "3.0",
+    "B-" = "2.7", "C+" = "2.3",
+    "C" = "2.0", "C-" = "1.7",
+    "D+" = "1.3", "D" = "1.0",
+    "F" = "0.0")

这创建了一个命名向量。然后您可以通过应用于该向量的提取函数推送 Grade 列的值:

> filtered_data$num.char <- trans.vec[filtered_data$Grade]
> filtered_data
   Grade num.char
1      A      4.0
2     B+      2.7
3      C      2.3
4     A-      3.7
5      D      1.3
6      B      3.3
7     B-      3.0
8     C+      1.7
9     C-      2.0
10    D+      1.0
11     F      0.0
> str(filtered_data)
'data.frame':   11 obs. of  2 variables:
 $ Grade   : Factor w/ 11 levels "A","A-","B","B-",..: 1 5 6 2 9 3 4 8 7 10 ...
 $ num.char: chr  "4.0" "2.7" "2.3" "3.7" ...

向量的值不需要是字符。您可以使用如下命名的数字向量来跳过所有 as.character.as.numeric folderol:

> trans.vec.num=  c("A"=4.0, "A-"=3.7,
+    "B+" = 3.3, "B" = 3.0,
+    "B-" = 2.7, "C+" = 2.3,
+    "C" = 2.0, "C-" = 1.7,
+    "D+" = 1.3, "D" = 1.0,
+    "F" = 0.0)
> filtered_data$num.num <- trans.vec.num[filtered_data$Grade]
> str(filtered_data)
'data.frame':   11 obs. of  3 variables:
 $ Grade   : Factor w/ 11 levels "A","A-","B","B-",..: 1 5 6 2 9 3 4 8 7 10 ...
 $ num.char: chr  "4.0" "2.7" "2.3" "3.7" ...
 $ num.num : num  4 2.7 2.3 3.7 1.3 3.3 3 1.7 2 1 ...

请注意,原始成绩列是一个因素,但不会影响“[”功能。