如何在R中实现数值到指定字母标识的映射分配?
错误原因
你代码的核心问题有两个:
- R中基础的
if/else语句只能处理长度为1的判断条件,你传入了长度为20的matik向量,所以只会取第一个元素判断,输出结果自然不对 - 判断数值是否属于某个区间/向量不能用
==,应该用%in%运算符,否则会触发长度不匹配的警告
解决方案1:遍历判断(适合初学者理解)
直接循环遍历matik里的每一个数值,逐个判断分类:
matik = c(70, 25, 78, 90, 67, 77, 83, 99, 45, 76, 45, 24, 55, 70, 65, 75, 68,89,55,68) # 初始化结果向量 result = character(length(matik)) for (i in seq_along(matik)) { num = matik[i] if (num >= 81) { result[i] = "A" } else if (num %in% 71:80) { result[i] = "AB" } else if (num %in% 66:70) { result[i] = "B" } else if (num %in% 61:65) { result[i] = "BC" } else if (num %in% 56:60) { result[i] = "C" } else if (num %in% 41:55) { result[i] = "D" } else { result[i] = "E" } } print(result)
运行后输出的分类结果和matik的数值是一一对应的。
解决方案2:使用cut函数(R原生分箱方法,更简洁)
cut是R专门用来给数值分区间打标签的函数,不用写循环和多层判断:
matik = c(70, 25, 78, 90, 67, 77, 83, 99, 45, 76, 45, 24, 55, 70, 65, 75, 68,89,55,68) # 设置区间断点,right=FALSE表示区间左闭右开,符合你的规则 result = cut(matik, breaks = c(-Inf, 40, 55, 60, 65, 70, 80, Inf), labels = c("E", "D", "C", "BC", "B", "AB", "A"), right = FALSE) # 转成字符向量输出 result = as.character(result) print(result)
两种方法得到的结果完全一致。
内容的提问来源于stack exchange,提问作者wendy forehead
相关产品推荐
相关产品推荐

