在 R 中联接不完全匹配的表。仅当整个单词匹配时才匹配

Join tables with inexact match in R. Only match if a whole word matches

提问人:Ajern 提问时间:1/11/2023 最后编辑:Ajern 更新时间:1/11/2023 访问量:111

问:

我有一个问题,可以通过以下方式重现:

library(tidyverse)
a <- tibble(navn=c("Oslo kommune", "Oslo kommune", "Kommunen i Os", "Kommunen i Eidsberg", "Eid fylkeskommune"), person=c("a", "c", "b", "a", "b"))
b <- tibble(knavn=c("Oslo", "Eid", "Eidsberg", "Os"), tall=c(1,2,3,4))

library(fuzzyjoin)
library(stringr)

c <- a %>%
  fuzzy_left_join(b, by=c("navn"="knavn"), match_fun=str_detect)

我希望“奥斯陆公社”与“奥斯陆”匹配,而不是与“奥斯”匹配,并且“Kommunen i Eidsberg”与“Eidsberg”匹配,而不是“Eid”。我希望该函数仅在 a 中的变量 navn 中查找与 b 中变量 knavn 中的单词匹配的整个单词。因此,c 变为:

tibble(navn=c("Oslo kommune", "Oslo kommune", "Kommunen i Os", "Kommunen i Eidsberg", "Eid fylkeskommune"), person=c("a", "c", "b", "a", "b"), knavn=c("Oslo","Oslo", "Os", "Eidsberg", "Eid"),tall=c(1,1,4,3,2))

我该怎么做?

R stringr 模糊连接

评论


答:

0赞 Maël 1/11/2023 #1

您可以添加以捕获单词:\\b

a %>%
  fuzzy_left_join(b, by = c("navn" = "knavn"), 
                  match_fun = \(x, y) str_detect(x, paste0("\\b", y, "\\b")))

# A tibble: 5 × 4
  navn                person knavn     tall
  <chr>               <chr>  <chr>    <dbl>
1 Oslo kommune        a      Oslo         1
2 Oslo kommune        c      Oslo         1
3 Kommunen i Os       b      Os           4
4 Kommunen i Eidsberg a      Eidsberg     3
5 Eid fylkeskommune   b      Eid          2

如果你在整洁的宇宙中工作,可能会更好。glue("\\b{y}\\b")

0赞 Andre Wildberg 1/11/2023 #2

使用grepl

join_word_match <- function(a, b, first_col, second_col)
  data.frame(do.call(rbind, apply(b, 1, function(x){
    res <- grepl(paste0("\\b", x[second_col], "\\b"), unlist(a[, first_col]))
      do.call(cbind, c(a[res,], x))})))

join_word_match(a, b, "navn", "knavn")
                 navn person    knavn tall
1        Oslo kommune      a     Oslo    1
2        Oslo kommune      c     Oslo    1
3   Eid fylkeskommune      b      Eid    2
4 Kommunen i Eidsberg      a Eidsberg    3
5       Kommunen i Os      b       Os    4