首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过字符串匹配将两个数据流与dplyr和stringdist合并

通过字符串匹配将两个数据流与dplyr和stringdist合并
EN

Stack Overflow用户
提问于 2019-05-02 20:22:33
回答 2查看 521关注 0票数 2

我试图基于非常相似的语言对两个数据文件执行dplyr左连接(这并不准确)。

DF1:

代码语言:javascript
复制
title | records
Bob's show, part 1 | 42
Time for dinner | 77
Horsecrap | 121

DF2:

代码语言:javascript
复制
showname | counts
Bob's show part 1 | 772
Dinner time | 89
No way Jose | 123

我执行此操作是为了使用字符串包/库作为向量获取字符串距离:

代码语言:javascript
复制
titlematch <- amatch(df1$title,df2$showname) 

矢量看起来像..。一个整数向量:

代码语言:javascript
复制
titlematch
1
2
NA

通常情况下,如果我有准确的匹配,我会做:

代码语言:javascript
复制
blended <- left_join(df1, df2, by = c("title" = "showname"))

如何使用向量作为记录选择器进行左联接,以便最终结果是:

代码语言:javascript
复制
title | records | showname | counts
Bob's show, part 1 | 42 | Bob's show part 1 | 772
Time for dinner | 77 | Dinner time | 89

由于向量(NA)中没有可能匹配,所以排除了第三次不匹配。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-02 23:47:44

camille suggested in a comment

你看过fuzzyjoin吗?

我以前从未听说过fuzzyjoin,但我试过并且喜欢它。stringdist_left_join正是我所需要的。

票数 1
EN

Stack Overflow用户

发布于 2019-05-02 21:06:58

这是一次机会,

代码语言:javascript
复制
library(stringdist)
library(tidyverse)

df1 %>%
  as_tibble() %>%
  mutate(temp = amatch(title, df2$showname, maxDist = 10)) %>%
  bind_cols(df2[.$temp, ]) %>%
  select(-temp)

# A tibble: 3 x 4
  title              records showname          counts
  <chr>                <int> <chr>              <int>
1 Bob's show, part 1      42 Bob's show part 1    772
2 Time for dinner         77 Dinner time           89
3 Horsecrap              121 Dinner time           89

我无法再现您的数字匹配向量,amatch(df1$title, df2$showname)给我[1] NA NA NA,因为它的默认值是0.1,所以我将maxDist设置为10。

最后,您可以始终添加%>% filter(is.na(showname))以删除任何没有匹配的行。

数据

代码语言:javascript
复制
df1 <- structure(list(title = c("Bob's show, part 1", "Time for dinner", 
"Horsecrap"), records = c(42L, 77L, 121L)), .Names = c("title", 
"records"), row.names = c(NA, -3L), class = "data.frame")

df2 <- structure(list(showname = c("Bob's show part 1", "Dinner time", 
"No way Jose"), counts = c(772L, 89L, 123L)), .Names = c("showname", 
"counts"), row.names = c(NA, -3L), class = "data.frame")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55959725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档