You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:29:57