【发布时间】:2017-09-04 04:01:22
【问题描述】:
我有一个 CSV 文件,其中有一个“等级”列,其中包含从“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)) 做一些技巧,但效果不佳。
第三种“硬编码”方法效果不佳,因为我尝试实现 for 循环 来更改列中的每个条目,但我收到了这条消息
Warning message:
In `[<-.factor`(`*tmp*`, i, value = c(11L, 16L, 5L, 13L, 8L, 16L, :
invalid factor level, NA generated
提前致谢!
【问题讨论】:
-
您可以将具有值的数据框定义为查找表,然后将其合并到原始数据中,从而使用数值创建一个新变量。例如。
lookupTable <- data.frame(Grade = c("A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "F"), Grade_num = c(4.0, 3.7, 3.3, 3.0, 2.7, 2.3, 2.0, 1.7, 1.3, 1.0, 0))。然后filtered_data <- merge(x = filtered_data, y = lookupTable, by = "Grade")