R中如何修正str_detect/str_contains函数生成的匹配输出结果
问题根源
- 原有代码采用任意子串匹配逻辑,只要方法名字符串出现在
methods_discussed的任意位置就会判定为匹配,因此male_sterilization作为female_sterilization的子串会被误判为存在。 - 原有逻辑没有对
-77、空值(NA)两类特殊取值做单独处理,所有行统一输出0/1,不符合留空要求。
修正后代码
首先确保已加载stringr包:
library(stringr) # 循环生成指示变量 for (abc in method_names) { # 构造带单词边界的匹配规则,仅匹配完整的方法名 match_pattern <- paste0("\\b", abc, "\\b") # 执行匹配 match_result <- str_detect(multi2$methods_discussed, match_pattern) # 定位需要留空的行:原列取值为-77或NA na_flag <- multi2$methods_discussed == -77 | is.na(multi2$methods_discussed) # 赋值:非特殊行转整数,特殊行设为NA multi2[[abc]] <- as.integer(match_result) multi2[[abc]][na_flag] <- NA_integer_ }
修改说明
- 匹配逻辑升级:新增单词边界
\b约束,只有完整的方法名出现时才会判定为匹配,彻底解决短方法名被长方法名包含导致的误判问题。 - 特殊值处理:单独标记原列取值为-77、NA的行,将这些行对应的所有指示变量统一设为NA(留空),不会输出0/1。
内容的提问来源于stack exchange,提问作者Ashish Bandhu
相关产品推荐
相关产品推荐

