我是R的新手,我一直在尝试模糊匹配两个大型数据集,而不会使我的计算机崩溃。一开始我花了很长时间,所以我把数据帧分割成一个列表,并使用了purrr:map,但这仍然需要很长时间,而且不起作用。
因此,现在我在两个数据集中使用拆分名称,然后逐个列表循环。
假设我有两个数据集。
list.a <- data.frame(name=c("aa","bb","cc","dd","ee","ff","gg") )
list.b <- data.frame(name=c("ab","cb","ff","dd","ee","ff","gg"))我用第一个字符串将名字分成子串,然后按字母表拆分。
list.a <- list.a %>%
mutate(id_a=str_sub(name, 1,1))
list.b <- list.b %>%
mutate(id_a=str_sub(name, 1,1))
list.a <- split(list.a, list.a$id_a)
list.b <- split(list.b, list.b$id_a)此拆分函数将根据名称的第一个字母提供拆分数据的列表。
这就是让我头疼的部分,我不知道该怎么做。我尝试通过名称的a,b,c,d进行模糊匹配(所以名称在两个集合中都以a开头,然后移到b name,依此类推)。
我正在尝试通过'name‘对两个数据集中以相同字母表开头的每个列表进行模糊连接。
purrr::map(list.a, ~stringdist_inner_join(x=., y=list.b,
by="name",
ignore_case=FALSE,
method="jw",
max_dist=0.25))我的预期输出是,一旦这些数据集通过模糊匹配连接在一起,最后就会将它们组合在一起。
谢谢你的建议!
发布于 2021-11-04 02:08:18
我不确定您的预期输出是什么,但这里有一个使用Reduce的可能解决方案。这个解决方案不像您在示例中那样使用split。
library(tidyverse)
library(fuzzyjoin)
list.a <- data.frame(name=c("aa","bb","cc","dd","ee","ff","gg") )
list.b <- data.frame(name=c("ab","cb","ff","dd","ee","ff","gg"))
list.a <- list.a %>%
mutate(id_a=str_sub(name, 1,1))
list.b <- list.b %>%
mutate(id_a=str_sub(name, 1,1))
join_dfs <- function(df1, df2){
stringdist_semi_join(x = df1,
y = df2,
by = "id_a",
ignore_case = F,
method = "jw",
max_dist = 0.25)
}
all <- list(list.a, list.b)
Reduce(join_dfs, all)这为我们提供了:
name id_a
1 aa a
3 cc c
4 dd d
5 ee e
6 ff f
7 gg ghttps://stackoverflow.com/questions/69833334
复制相似问题