【问题标题】:How can I filter a dataframe which has similar data from another dataframe?如何过滤具有来自另一个数据帧的相似数据的数据帧?
【发布时间】:2021-09-09 21:48:43
【问题描述】:

我想过滤一个数据框,其中我有一个不同名称的列。我需要应用的过滤器必须通过与另一个数据帧具有不同名称的另一列相似的名称(2 个或多个共同词)来过滤该数据帧。问题是两个数据帧的长度不同:第一个数据帧有 342 行,第二个数据帧有 1557 行。

想象一下我有这 2 个数据框:

  df1 <- data.frame(name1 = c("Carlos Lopez Rey", "Monica Naranjo Garcia", "Antonio Perez Reverte", "Alejandro Martinez Amor", "Iñigo Muruzabal", "Daniel Huarte", "Javier Langarica", "Yearai Bacaicoa")

  df2 <- data.frame(name2 = c("Lopez, Carlos", "Monica de Naranjo", "Garcia, Antonio", "Alejandro Martinez de Amor", "Muruzabal, Javier", "Pepe Gallego Lopez", "Fernando Alonso", "Arturo Goikoetxea", "Iñigo Lizarraga", "Laura Ripagaina", " Monica de Naranjo", "Rey Lopez, Carlos"),
                    phone = c("632548795", "658749521", "669874521", "686056350", "619106219", "687884760", "639362459", "645879521", "645214587", "613456789", "698547132", "698547123" ))

我想从 df2 中的“name2”列中获取具有相似名称(2 个或多个共同词)的人的“电话”和“name2”。

我想得到的结果是:

name1 name2 phone
Carlos Lopez Rey Lopez, Carlos 632548795
Monica Naranjo Garcia Monica de Naranjo 658749521
Alejandro Martinez Amor Alejandro Martinez de Amor 686056350
Monica Naranjo Garcia Monica de Naranjo 698547132
Carlos Lopez Rey Rey Lopez, Carlos 698547123

重要提示:如您所见,同一个名称可以在第二个数据帧中出现多次,因为一个用户可以分配多个电话号码。我需要将每个电话号码分配给名称与第一个数据帧中包含的名称相似的每个用户。

提前致谢!!!!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以用逗号或空格分割字符串,并计算每个组合的重叠数。你可以试试这个答案 -

    #Split string on comma or whitespace
    tmp1 <- strsplit(df1$name1, ',|\\s+')
    tmp2 <- strsplit(df2$name2, ',|\\s+')
    
    #Get the corresponding matches
    result <- purrr::map_df(seq_along(tmp1), function(x) {
      inds <- which(sapply(tmp2, function(y) length(intersect(tmp1[[x]], y))) >= 2)
      if(length(inds))
        dplyr::bind_cols(df1[x, , drop = FALSE], df2[inds, ])
    })
    
    result
    #.                   name1                      name2     phone
    #1        Carlos Lopez Rey              Lopez, Carlos 632548795
    #2        Carlos Lopez Rey          Rey Lopez, Carlos 698547123
    #3   Monica Naranjo Garcia          Monica de Naranjo 658749521
    #4   Monica Naranjo Garcia          Monica de Naranjo 698547132
    #5 Alejandro Martinez Amor Alejandro Martinez de Amor 686056350
    

    【讨论】:

    • 而不是cbind,如何使用inner_join?因为有时同一个名字可能会在第二个数据帧中出现多次,并且使用不同的电话号码(不同的电话号码可以分配给同一个人)谢谢!
    • 对不起,我不明白你的意思。你能用一个例子更新你的帖子吗?
    • 是的!我刚刚用我想要的结果更新了帖子(看到有些用户的名字重复,因为他们分配了多个电话号码)谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多