R语言中匹配数据框列指定前两位ICD-10编码的高效实现方法
R实现ICD-10编码前缀匹配的高效方法
以下三种方案均比%like%搭配case_when的执行效率更高,尤其在十万行以上的数据集上性能优势更明显:
方案1:截取前缀匹配(可读性最高,不易出错)
先统一编码大小写,截取前两位后直接匹配目标前缀集合,逻辑清晰,对正则不熟悉的用户优先选这个:
# 示例编码向量 codes = c("s001", "s1234", "s4g6", "T002", "T191","t985","s761","t17.5") # 统一转大写后截取前两位,判断是否在目标前缀集合中 code_prefix <- substr(toupper(codes), 1, 2) result <- as.integer(code_prefix %in% c("S0", "S1", "T0", "T1", "T9"))
返回的result对应示例编码的结果为:1 1 0 1 1 1 0 1,完全符合需求。
方案2:base R正则匹配(无依赖,代码简洁)
直接用base R自带的grepl函数做正则匹配,不需要加载任何第三方包,单行即可完成:
result <- as.integer(grepl("^([Ss][01]|[Tt][019])", codes))
正则说明:^匹配字符串开头,[Ss]匹配大小写的S,[Tt]匹配大小写的T,后续字符限制为目标前缀的第二位即可。
方案3:stringi正则匹配(超大数据集最优)
如果你的数据集行数超过百万,推荐用性能更优的stringi包函数,执行速度比base R快2-3倍:
library(stringi) result <- as.integer(stri_detect_regex(codes, "^([Ss][01]|[Tt][019])"))
小提示:如果你的编码列已经提前统一为全大写/全小写,可以去掉正则里的大小写匹配规则,或者转大小写的步骤,执行效率会进一步提升。
内容的提问来源于stack exchange,提问作者kam
相关产品推荐
相关产品推荐

