R中使用带If/Else的For循环为DataFrame新增成绩等级列求助
问题原因
你当前循环中的i只是从Result向量中读取的临时副本,对i的赋值不会修改原向量的数值,自然无法将转换后的等级存入目标数据框。
解决方法
方法1:修改现有循环逻辑
保留你已经写好的判断规则,调整循环遍历方式,新增向量存储转换后的等级:
Result <- c(50,67,89,77,65,66,70,73,69,80) # 新建等长空向量存储转换后的等级 grade <- character(length(Result)) # 遍历索引而非直接遍历数值 for (i in seq_along(Result)){ score <- Result[i] if (score < 16.67) { grade[i] <- "G+" } else if (score < 26.67) { grade[i] <- "F+" } else if (score < 36.67) { grade[i] <- "E+" } else if (score < 40) { grade[i] <- "D+" } else if (score < 43.33) { grade[i] <- "D" } else if (score < 46.67) { grade[i] <- "D+" } else if (score < 50) { grade[i] <- "C-" } else if (score < 53.33) { grade[i] <- "D" } else if (score < 56.67) { grade[i] <- "D+" } else if (score < 60) { grade[i] <- "B-" } else if (score < 63.33) { grade[i] <- "B" } else if (score < 66.67) { grade[i] <- "B+" } else if (score < 70) { grade[i] <- "A-" } else if (score < 73.33) { grade[i] <- "A" } else if (score < 100) { grade[i] <- "A+" } } # 存入数据框 df <- data.frame(score = Result, grade = grade)
方法2:使用R原生cut函数(更适合大数据集)
R内置的cut函数专门用于数值分箱操作,代码更简洁,运行效率远高于自定义循环,完全适配你的需求:
Result <- c(50,67,89,77,65,66,70,73,69,80) # 定义分数分界点 breaks <- c(-Inf,16.67,26.67,36.67,40,43.33,46.67,50,53.33,56.67,60,63.33,66.67,70,73.33,100) # 定义对应等级,顺序与分界点间隔一一对应 labels <- c("G+","F+","E+","D+","D","D+","C-","D","D+","B-","B","B+","A-","A","A+") # 完成分箱转换 grade <- cut(Result, breaks = breaks, labels = labels, right = FALSE) # 存入数据框 df <- data.frame(score = Result, grade = grade)
注意事项
你现有代码中存在一处逻辑不一致:分数小于40的分支,print输出的是D-,但赋值为D+,可根据你实际的等级映射规则调整修正。
内容的提问来源于stack exchange,提问作者MsElaineous
相关产品推荐
相关产品推荐

