在R中使用ifelse匹配字母数字范围时无法捕获末尾值的问题
问题解决:R语言按字母数字范围分类数据框
问题原因
字符串比较是逐字符按ASCII顺序进行的,你的code是四位字符串(字母+三位数字),但条件中使用的上限是三位字符串(如"D48"),导致长度不同的字符串比较不符合预期:
"D486" > "D48":前三个字符相同,"D48"长度更短,被视为更小的字符串"D899" > "D89":同理,因此这两个值被判定为不符合条件,返回NA
方法一:调整条件上限为匹配code格式的四位字符串
直接把条件中的上限改为对应四位字符串的最大值,确保覆盖所有以目标前缀开头的code:
df$cause <- ifelse(df$code >= "C000" & df$code <= "D489", "cause 1", ifelse(df$code >= "D500" & df$code <= "D899", "cause 2", NA))
运行后输出:
id code cause 1 1 C410 cause 1 2 2 D486 cause 1 3 3 D485 cause 1 4 4 D501 cause 2 5 5 D600 cause 2 6 6 D899 cause 2
方法二:截取code的前缀进行比较
如果你的分类逻辑是基于前三位字符(字母+前两位数字),可以用substr()提取前三位后再比较,更贴合分类规则且灵活性更强:
df$cause <- ifelse(substr(df$code, 1, 3) >= "C00" & substr(df$code, 1, 3) <= "D48", "cause 1", ifelse(substr(df$code, 1, 3) >= "D50" & substr(df$code, 1, 3) <= "D89", "cause 2", NA))
这种方法即使后续code长度变化(如出现五位code),只要前缀规则不变就能正常工作。
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

