gpt4 book ai didi

r - str_detect 在同一行的多列上

转载 作者:行者123 更新时间:2023-12-04 08:56:46 35 4
gpt4 key购买 nike

我有两个数据集,一个是全名,一个是名字和姓氏。

library(tidyverse)
(x = tibble(fullname = c("Michael Smith",
"Elisabeth Brown",
"John-Henry Albert")))
#> # A tibble: 3 x 1
#> fullname
#> <chr>
#> 1 Michael Smith
#> 2 Elisabeth Brown
#> 3 John-Henry Albert

(y = tribble(~first, ~last,
"Elisabeth", "Smith",
"John", "Albert",
"Roland", "Brown"))
#> # A tibble: 3 x 2
#> first last
#> <chr> <chr>
#> 1 Elisabeth Smith
#> 2 John Albert
#> 3 Roland Brown
我想创建一个 bool 列,仅当第一列和最后一列在全名列中时才为真。
本质上,我正在寻找类似的东西:
x %>% 
mutate(fname_match = str_detect(fullname, paste0(y$first, collapse = "|")), ## correct
lname_match = str_detect(fullname, paste0(y$last, collapse = "|"))) ## correct
#> # A tibble: 3 x 3
#> fullname fname_match lname_match
#> <chr> <lgl> <lgl>
#> 1 Michael Smith FALSE TRUE
#> 2 Elisabeth Brown TRUE TRUE
#> 3 John-Henry Albert TRUE TRUE
但是在这里,如果我用两个 TRUE 取列的 Elisabeth Brown 将是误报,因为匹配的名字和姓氏不在同一行。
到目前为止,我最好的想法是结合第一列和最后一列并搜索它,但这会为 John-Henry 创建一个假阴性
y = tribble(~first, ~last,
"Elisabeth", "Smith",
"John", "Albert",
"Roland", "Brown") %>%
rowwise() %>%
mutate(longname = paste(first, last, sep = "&"))


x %>%
mutate(full_match = str_detect(fullname, paste0(y$longname, collapse = "|")))
#> # A tibble: 3 x 2
#> fullname full_match
#> <chr> <lgl>
#> 1 Michael Smith FALSE
#> 2 Elisabeth Brown FALSE
#> 3 John-Henry Albert FALSE

最佳答案

我认为这可以满足您的需求,使用 purrr::map2迭代 first 的元组和 last .

library(dplyr)
library(purrr)

y %>%
mutate(
name_match = map2_lgl(
first, last,
.f = ~any(grepl(paste0(.x, '.*', .y), x$fullname, ignore.case = T))
)
)
介意, paste0(.x, '.*', .y)将它们组合成一个正则表达式,只允许行通过,其中姓氏完全出现在第一个之后。这似乎是合理的(否则,名字“Elisabeth”,姓氏“Abe”仍然是正确的,我在这里假设您不会想要)。
此外,上述内容不区分大小写。
//更新:
我忘了;相反,如果你想检查 fullname x 中的值,那么你可以运行这个:
x %>%
rowwise() %>%
mutate(
name_match = any(map2_lgl(
y$first, y$last,
.f = ~grepl(paste0('\\b', .x, '\\b.*\\b', .y, '\\b'), fullname, ignore.case = T)
))
)

根据此检查对您的重要性以及您想要做出多少假设,进一步调整上述正则表达式可能是有意义的:
  • 确保名字和姓氏为 isolated words在全名
    -> paste0('\\b', .x, '\\b.*\\b', .y, '\\b')
  • 测试名字是否正确出现在开头
    -> paste0('^', .x, '\\b.*\\b', .y, '\\b')
  • 测试全名是否在姓氏之后结束
    -> paste0('\\b', .x, '\\b.*\\b', .y, '$')
  • 关于r - str_detect 在同一行的多列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63779907/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com