R语言:实现类%in%的DataFrame列相似字符串匹配功能
R语言实现DataFrame字符串模糊匹配(类似%in%功能)
针对你需要匹配两个DataFrame的nombres列中相似字符串的需求,这里提供几种自定义实现方式,效果类似%in%但支持模糊匹配:
1. 构造示例数据
先还原你给出的测试数据:
df1 <- data.frame(nombres = c("Acesco Corporation", "Exito S.A", "AMI", "Renault"), stringsAsFactors = FALSE) df2 <- data.frame(nombres = c("Acesco", "Exito", "AMI", "Renault"), stringsAsFactors = FALSE)
2. 自定义模糊匹配运算符(匹配部分子串,排除完全相等项)
对应你期望输出Acesco, Exito, AMI的需求,这里自定义一个运算符,只匹配子串包含但内容不完全相等的项:
# 自定义部分模糊匹配运算符 `%sin_partial%` <- function(x, table) { sapply(x, function(val) { any(sapply(table, function(pattern) { grepl(pattern, val, ignore.case = TRUE) && val != pattern })) }) } # 从df2中筛选符合条件的匹配关键词 matched_terms <- df2$nombres[sapply(df2$nombres, function(p) { any(grepl(p, df1$nombres) & df1$nombres != p) })] # 输出结果 paste(matched_terms, collapse = ", ") # [1] "Acesco, Exito, AMI"
3. 通用版:包含完全匹配的模糊匹配
如果不需要排除完全相等的项,只需要判断字符串是否包含目标子串,可以用以下两种简化实现:
Base R 版本
# 自定义通用模糊匹配运算符 `%sin%` <- function(x, table) { sapply(x, function(val) any(sapply(table, function(p) grepl(p, val, ignore.case = TRUE)))) } # 获取df1中匹配的行 matched_df1 <- df1[df1$nombres %sin% df2$nombres, ] # 获取df2中对应的匹配关键词 matched_df2 <- df2[sapply(df2$nombres, function(p) any(grepl(p, df1$nombres))), ]
stringr 包版本(更简洁)
如果你习惯使用stringr处理字符串,代码可以进一步简化:
library(stringr) `%sin%` <- function(x, table) str_detect(x, str_c(table, collapse = "|")) # 获取df2中对应的匹配关键词 matched_df2 <- df2[str_detect(df1$nombres, str_c(df2$nombres, collapse = "|")), ] paste(matched_df2$nombres, collapse = ", ")
补充说明
ignore.case = TRUE表示忽略大小写匹配,若需要严格区分大小写,可移除该参数。- 自定义运算符的名称可根据个人习惯修改,比如
%like_in%等。
内容的提问来源于stack exchange,提问作者lasagna
相关产品推荐
相关产品推荐

