R语言 大数据集的模糊合并

ryevplcw  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(172)

我有一个大型数据集(300 k),并且有一个特定的列需要清理-名称列。问题是,由于人为输入错误,同一个名称可能会有多个无意的拼写,例如“Benjamin”拼写为“Banjamin”。
我试过openrefine,但是ngram merge和key collision都没能解决上面的例子,而Leveshtein距离公式永远持续下去,冻结了我的计算机。但是fuzzywuzzy + for循环又需要很长时间,而且似乎不可行。R studio似乎是一个很好的选择,但是我不知道如何处理这个问题?我尝试了包“refinr”但这和openrefine一样,不能处理“Benjamin”和“Banjamin”类型的拼写错误,只有当有一个字母重复或单词之间有空格时才有效。
有人对我该怎么做有什么建议吗?
谢谢

lo8azlld

lo8azlld1#

我想fuzzyjoin-包会满足你的愿望。

df1 <- data.frame( name = c("James", "Benjamin", "Bert"), id = 1:3 )
df2 <- data.frame( name = c("Banjamin", "David", "Jemes"), id = 4:6 )

library( fuzzyjoin )
stringdist_join( df1, df2, by = "name")

#     name.x id.x   name.y id.y
# 1    James    1    Jemes    6
# 2 Benjamin    2 Banjamin    4
njthzxwz

njthzxwz2#

完全的自我提升,但是我已经写了一个R包zoomerjoin,它使用MinHash,允许你模糊地连接大型数据集,而不必比较两个 Dataframe 之间的所有行对,这意味着你可以在现代数据科学笔记本电脑上在几秒钟或几分钟内合并中等大小(数百万行)的 Dataframe ,而不会耗尽内存。
您给予的示例仍然运行缓慢,因为需要检查大量“正确”匹配(df_1中的每一行都将与df_2中的数千行匹配),但在大多数用例中,该包将允许您模糊地匹配数百万行的 Dataframe 。
下面是我将如何使用该包来连接您提供的示例 Dataframe 的两个较小版本:

library(tidyverse)
library(fuzzyjoin)

# Must have the Rust compiler installed to install this package
# see https://github.com/beniaminogreen/zoomerjoin for more details 
devtools::install_github("beniaminogreen/zoomerjoin")
library(zoomerjoin)

n <- 500
id_1 <- 1:n
names_1 <- sample(c("hannah", "marcus", "fred", "joe", "lara"), n, 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:n
names_2 <- sample(c("hannah", "markus", "paul", "mary", "olivia"), n, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))
anyNumber <- sample(c(123, 234, 345, 456, 567), n, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.2))
df_2 <- data.frame(id_2, names_2, anyNumber)

joined_df_s <- lsh_inner_join(df_1, df_2, by=c("names_1" = "names_2"), n_gram_width = 1, threshold = .5)

这个包还在开发中(尽管它的输出已经过fuzzyjoin的准确性测试),所以如果文档中有不清楚的地方,或者你发现了任何bug,请不要犹豫,在github上提交一个问题。

相关问题