如何用R的dplyr包将距离数值列转为分类字符列?
问题分析与修正方案
你的代码存在三个关键问题:
- mutate语法错误:额外传入了
Total Distance参数,不符合mutate的语法规范,应直接定义新列的赋值逻辑。 - 区间匹配方式错误:用
%in% 3500:5499只能匹配整数数值,若Total Distance包含小数(比如3500.2),这类值会被遗漏,需用连续区间的逻辑判断(>=和<=)。 - 区间逻辑错误:
7500:1500在R中会生成空向量(起始值大于结束值),导致该条件永远无法触发。结合你的取值范围(0-12000)和前面的区间划分,推测这里应该是7500到12000的区间(前一个区间到7499)。
修正后的代码(推荐用case_when)
用dplyr::case_when替代嵌套ifelse,代码可读性更强:
library(dplyr) MSoc <- MSoc %>% mutate(Dist = case_when( between(`Total Distance`, 3500, 5499) ~ "Moderate", between(`Total Distance`, 5500, 7499) ~ "Moderate-Hard", between(`Total Distance`, 7500, 12000) ~ "Hard", # 修正后的Hard区间 TRUE ~ "Easy" # 其余所有情况返回Easy ))
如果坚持用嵌套ifelse,修正后的代码如下:
MSoc <- MSoc %>% mutate(Dist = ifelse(`Total Distance` >= 3500 & `Total Distance` <= 5499, "Moderate", ifelse(`Total Distance` >= 5500 & `Total Distance` <= 7499, "Moderate-Hard", ifelse(`Total Distance` >= 7500 & `Total Distance` <= 12000, "Hard", "Easy"))))
补充说明
between(x, left, right)是dplyr提供的便捷函数,等价于x >= left & x <= right,让代码更简洁。- 如果你的
Hard区间确实是1500相关的其他范围(比如1500以下),只需调整case_when中的条件即可,比如把第三个条件改成between(Total Distance, 0, 1499),同时对应调整其他区间的逻辑。
内容的提问来源于stack exchange,提问作者Steven C
相关产品推荐
相关产品推荐

