如何用R语言grepl()函数匹配字符串与数据框两列对应值?
用R的grepl()实现对应规则的匹配筛选
原始数据
df <- data.frame( col1 = c("abc_1_102", "abc_1_103", "xyz_1_104") ) selection <- data.frame(col1 =c("abc", "xyz"),col2 =c("102", "106"))
期望输出
col1 col9 1 abc_1_102 SELECT 2 abc_1_103 NOTSELECT 3 xyz_1_104 NOTSELECT
问题分析
尝试的代码未实现selection中col1与col2的对应匹配,只是分别匹配所有col1和col2的取值,导致逻辑错误:
df$col2 <- ifelse(grepl(paste("^", selection$col1, "$", collapse = "|"), df$col1)& grepl(paste("^", selection$col2, "$", collapse = "|"), df$col1), "SELECT", "NOTSELECT") print(df)
错误结果:
col1 col2 1 abc_1_102 NOTSELECT 2 abc_1_103 NOTSELECT 3 xyz_1_104 NOTSELECT
正确解法
需要将selection每行的col1和col2绑定为一组匹配规则,而非分开匹配所有值。
方法一:逐行构建匹配模式
# 为selection每行生成精准匹配规则:以col1开头、col2结尾,中间用下划线分隔 match_patterns <- apply(selection, 1, function(row) paste0("^", row["col1"], "_.*_", row["col2"], "$")) # 检查每个df$col1是否匹配任意一组规则 df$col9 <- ifelse(rowSums(sapply(match_patterns, grepl, x = df$col1)) > 0, "SELECT", "NOTSELECT") print(df)
方法二:合并为单个正则表达式
# 把所有对应规则合并成一个正则,用|分隔 combined_pattern <- paste( mapply(function(prefix, suffix) paste0("^", prefix, "_.*_", suffix, "$"), selection$col1, selection$col2), collapse = "|" ) df$col9 <- ifelse(grepl(combined_pattern, df$col1), "SELECT", "NOTSELECT") print(df)
两种方法都能得到期望的输出:
col1 col9 1 abc_1_102 SELECT 2 abc_1_103 NOTSELECT 3 xyz_1_104 NOTSELECT
内容的提问来源于stack exchange,提问作者vp_050
相关产品推荐
相关产品推荐

