R语言如何基于字符与数字迭代高效创建虚拟变量
R中快速生成I00-I99匹配虚拟变量的实现方法
你完全不需要逐一枚举100个编码写判断条件,也不需要写冗余循环,以下几种写法都可以大幅简化代码,运行效率也比长串|连接的判断更高:
推荐写法(和原逻辑100%等价,最简洁)
直接生成完整的目标编码向量,用%in%做匹配即可,代码如下:
library(dplyr) mort <- mort %>% mutate( newcat = as.integer(ucod %in% sprintf("I%02d", 0:99)) )
关键逻辑说明:
0:99生成0到99的连续整数序列sprintf("I%02d", 0:99)会自动为个位数补前导零,一次性输出"I00" "I01" ... "I99"的完整字符向量,完全覆盖你需要的所有取值%in%逐行判断ucod是否属于上述编码集合,返回TRUE/FALSE逻辑值,转成整数后就是你需要的1/0虚拟变量,和原代码判断结果完全一致。
循环实现写法(供参考,适合非连续编码场景)
如果后续遇到非连续的编码需要迭代拼接,可以用循环构造匹配集合,但对于当前连续编码的场景没必要使用:
target_codes <- c() for (num in 0:99) { target_codes <- c(target_codes, paste0("I", sprintf("%02d", num))) } mort <- mort %>% mutate(newcat = as.integer(ucod %in% target_codes))
正则匹配写法(适合编码规则严格的场景)
如果确认ucod字段的编码规则统一,也可以直接用正则判断,不需要预先生成编码集合:
mort <- mort %>% mutate(newcat = as.integer(grepl("^I\\d{2}$", ucod)))
注意:该写法会匹配所有以大写I开头、后面仅跟两位数字的取值,会自动排除I100(三位数字后缀)、Iab(非数字后缀)等不符合规则的值,两位数字天然覆盖00-99范围,数据无异常编码时和前两种写法效果完全一致。
内容的提问来源于stack exchange,提问作者Young
相关产品推荐
相关产品推荐

