提问人:Ajern 提问时间:1/11/2023 最后编辑:Ajern 更新时间:1/11/2023 访问量:111
在 R 中联接不完全匹配的表。仅当整个单词匹配时才匹配
Join tables with inexact match in R. Only match if a whole word matches
问:
我有一个问题,可以通过以下方式重现:
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))
我该怎么做?
答:
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
评论