Anti_join 按模式

Anti_join by pattern

Tibble A 包含可以在 tibble B 中找到的 keys/patterns。我的目标是识别在 tibble B.

中未找到的 keys/patterns

我想通过匹配模式反连接两个表:

A <- tibble( colA = c("B12", "B19", "B202", "B87", "B61", "B55") )
B <- tibble( colB = c("aaB87aa", "bbbbB55", "B202cccc") )

我发现 fuzzyjoin 中的功能应该可以工作,但我无法正确使用它:

test <- regex_anti_join(A, B, by = c(colB = "colA"))

编辑

最后我想要这样的东西:

test
1 B12
2 B19
3 B61

给定示例数据的一个 dplyr 选项可以是:

A %>%
 filter(!colA %in% gsub("[a-z]", "", B$colB))

  colA 
  <chr>
1 B12  
2 B19  
3 B61  

regex_anti_join(A, B, by = c(colA = colB))colA 中执行 colBstr_detect。在你的情况下,这个 return 什么都没有,因此结果是空的。

您需要做的是相反的操作:在 colB.

中搜索 colA

这可以通过将匹配函数指定为 regex_anti_join 使用的 fuzzy_join 函数来实现:

library(fuzzyjoin)

# This is exactly the inverse of the match_fun used inside regex_anti_join
match_fun <- function(v1, v2) {
  stringr::str_detect(v2, stringr::regex(v1))
}

fuzzy_join(A, B, by = c("colA" = "colB"), match_fun=match_fun, mode = 'anti')
#> # A tibble: 3 x 1
#>   colA 
#>   <chr>
#> 1 B12  
#> 2 B19  
#> 3 B61

reprex package (v0.3.0)

于 2020-07-17 创建