如何解决测试单词是否在字符串中grepl、fuzzyjoin?
如果来自一个数据帧的两列的字符串包含在来自第二个数据帧的列的字符串中,我需要对两个数据帧进行匹配和连接。
示例数据框:
First <- c("john","jane","jimmy","jerry","matt","tom","peter","leah")
Last <- c("smith","doe","mcgee","bishop","gibbs","dinnozo","lane","palmer")
Name <- c("mr john smith","","timothy t mcgee","dinnozo tom","jane l doe","jimmy mcgee","leah elizabeth arthur palmer and co","jerry bishop the cat")
ID <- c("ID1","ID2","ID3","ID4","ID5","ID6","ID7","ID8")
df1 <- data.frame(First,Last)
df2 <- data.frame(Name,ID)
所以基本上,我有 df1
,它在名字和姓氏中都有相当有序的人名;我有 df2
,其中的名称可以组织为“名字、姓氏”或“姓氏名字”或“名字 MI 姓氏”或其他完全包含名称的名称。我需要来自 ID
的 df2
列。所以我想运行一个代码来看看 df1$First
and df2$Last
是否在 df2$Name
的字符串中的某个地方,如果是,让它拉并加入 { {1}} 到 df2$ID
。
我的 R 大师告诉我使用 df1
包中的 fuzzy_left_join
:
fuzzyjoin
但它给了我一个错误,其中参数不合逻辑;我不知道如何重写它来做我想做的事; documentation 表示 fzjoin <- fuzzy_left_join(df1,df2,by = c("First" = "Name"),match_fun = "contains")
应该是 match_fun
或 TRUE
,但我不知道如何处理。此外,它只匹配 FALSE
而不是 df1$First
和 df1$First
。我想我也许可以使用 grepl,但根据我所看到的示例,我不确定如何使用。有什么建议吗?
解决方法
文档说 match_fun
应该是一个 “给定两列的向量化函数,返回 TRUE
或 FALSE
以判断它们是否匹配。”它不是 TRUE 或 FALSE,它是一个返回 TRUE
或 FALSE
的函数。如果我们切换您的订单,我们可以使用 stringr::str_detect
,它会根据需要返回 TRUE
或 FALSE
。
fuzzyjoin::fuzzy_left_join(
df2,df1,by = c("Name" = "First","Name" = "Last"),match_fun = stringr::str_detect
)
# Name ID First Last
# 1 mr john smith ID1 john smith
# 2 ID2 <NA> <NA>
# 3 timothy t mcgee ID3 <NA> <NA>
# 4 dinnozo tom ID4 tom dinnozo
# 5 jane l doe ID5 jane doe
# 6 jimmy mcgee ID6 jimmy mcgee
# 7 leah elizabeth arthur palmer and co ID7 leah palmer
# 8 jerry bishop the cat ID8 jerry bishop
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。