【问题标题】:R fuzzyjoin loop through a listR blurjoin 循环遍历列表
【发布时间】:2021-11-04 00:46:00
【问题描述】:

我是 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 名称,依此类推)。

我正在尝试通过“名称”模糊加入两个数据集中以相同字母开头的每个列表。

purrr::map(list.a, ~stringdist_inner_join(x=., y=list.b, 
                                               by="name", 
                                               ignore_case=FALSE,
                                               method="jw",
                                               max_dist=0.25))

我的预期输出是,一旦这些数据集通过模糊匹配连接起来,最后会将它们组合在一起。

感谢您的任何建议!

【问题讨论】:

  • 你的预期输出是什么?
  • 嗨,马特,我刚刚编辑了我的帖子。基本上我用名字的第一个字母分割了两个数据。然后我想模糊加入以相同名称字母开头的每个拆分数据。我想这样做是为了减少时间而不是出错。然后,输出将附加列表到一​​个完整的数据帧中。

标签: r fuzzyjoin


【解决方案1】:

我不确定您的预期输出是什么,但这里有一个使用 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    g

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2016-06-28
    相关资源
    最近更新 更多