2

这是我的例子:

id <- 1:5
names_1 <- c("hannah", "marcus", "fred", "joe", "lara")
df_1 <- data.frame(id, names_1)
df_1$phonenumberFound <- NA


names_2 <- c("hannah", "markus", "fredd", "joey", "paul", "mary", "olivia")
phone <- c(123, 234, 345, 456, 567, 678, 789)
df_2 <- data.frame(names_2, phone)

我想要实现的是:

如果 df_2 中的一个名称(至少近似)与 df_1 中的名称匹配,那么我想在 df_1 中添加相应的电话号码。

基本上,这是一种模糊的左连接,但我没有成功。

事实上,我真正的 df_1 有 30.000 行,而我真正的 df_2 有 500.000 行。有没有快速的方法来做到这一点?

谢谢!

编辑:

当我使用迄今为止提供的答案遇到内存问题时,我需要更改和澄清我的示例。(我使用的是 16 GB RAM 的 Windows 笔记本。)

id_1 <- 1:30000
names_1 <- sample(c("hannah", "marcus", "fred", "joe", "lara"), 30000, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))
df_1 <- data.frame(id_1, names_1)
df_1$numberFound <- NA

id_2 <- 1:500000
names_2 <- sample(c("hannah", "markus", "paul", "mary", "olivia"), 500000, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))
anyNumber <- sample(c(123, 234, 345, 456, 567), 500000, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))
df_2 <- data.frame(id_2, names_2, anyNumber)

非常感谢任何有用的评论和答案。

4

2 回答 2

3

这是一个选项fuzzyjoin

library(fuzzyjoin)
stringdist_right_join((df_2, df_1, by = c("names_2" = "names_1")) %>%
      select(names(df_1), phone)
#  id names_1 phone
#1  1  hannah   123
#2  2  marcus   234
#3  3    fred   345
#4  4     joe   456
#5  5    lara   678

stringdistmatrix或者使用from stringdistpackage创建一个矩阵

library(stringdist)
df_2$phone[max.col(-stringdistmatrix(df_1$names_1, df_2$names_2), 'first')]
于 2019-12-09T13:37:48.227 回答
3

我们可以使用adistwhich 计算字符向量之间的字符串距离。

adist(df_1$names_1, df_2$names_2)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#[1,]    0    5    6    6    5    5    6
#[2,]    5    1    5    6    4    3    6
#[3,]    6    5    1    3    4    4    6
#[4,]    6    6    4    1    4    4    6
#[5,]    4    4    5    4    3    2    4

定义一些可以允许的合适阈值并分配相应的phone列。

thresh <- 1
mat <- adist(df_1$names_1, df_2$names_2) <= thresh
inds <- max.col(mat) * (rowSums(mat) > 0)
df_1$phone <- df_2$phone[replace(inds, inds == 0, NA)]

df_1
#  id names_1 phone
#1  1  hannah   123
#2  2  marcus   234
#3  3    fred   345
#4  4     joe   456
#5  5    lara    NA

但是,由于这会生成mbyn矩阵,因此它可能不是最有效的方法。

于 2019-12-09T14:00:07.180 回答