【问题标题】:fuzzy LEFT join with R模糊左连接与R
【发布时间】:2020-07-14 23:18:02
【问题描述】:
library(tidyverse)
library(fuzzyjoin)

df1 <- tibble(col1 = c("apple", "banana", "carrot"),
              col2 = as.numeric(0:2),
              col3 = as.numeric(0:2))
#> # A tibble: 3 x 3
#>   col1   col2  col3
#>   <chr> <int> <int>
#> 1 apple     0     0
#> 2 banana    1     1
#> 3 carrot    2     2

df2 <- tibble(col4 = c("app", "carr"), col5 = c(5, 9), matched = rep(TRUE, 2))
#> # A tibble: 2 x 3
#>   col4   col5 matched
#>   <chr> <dbl> <lgl>  
#> 1 app       5 TRUE   
#> 2 carr      9 TRUE 

我在df1df2 上方有两个数据框。 我需要为df1 创建一个新列,说明每一行是否与df2 中的条目匹配。

我还得模糊匹配,而且模糊需要不区分大小写(因此自定义了ci_str_detect函数):

ci_str_detect <- function(x, y){str_detect(x, regex(y, ignore_case = TRUE))}

df1 %>% 
  fuzzy_inner_join(df2, by = c("col1" = "col4"), match_fun = ci_str_detect)
#># A tibble: 2 x 6
#>  col1    col2  col3 col4   col5 matched
#>  <chr>  <dbl> <dbl> <chr> <dbl> <lgl>  
#>1 apple      0     0 app       5 TRUE   
#>2 carrot     2     2 carr      9 TRUE 

不幸的是(在这种情况下)fuzzyjoin R 包似乎只做 INNER JOIN,而不是我需要的 LEFT JOIN。

最终我需要这个输出:

#> # A tibble: 3 x 6
#>   col1    col2  col3 col4   col5  matched
#>   <chr>  <dbl> <dbl> <chr> <dbl>  <lgl>  
#> 1 apple      0     0 app       5  TRUE   
#> 2 banana     1     1 NA       NA  FALSE 
#> 3 carrot     2     2 carr      9  TRUE 

... LEFT JOIN 将提供如下所示的中间数据框,我可以将 NA 替换为 FALSE 以获得我最终想要的(直接在上方)。

#> # A tibble: 3 x 6
#>   col1    col2  col3 col4   col5  matched
#>   <chr>  <dbl> <dbl> <chr> <dbl>  <lgl>  
#> 1 apple      0     0 app       5  TRUE   
#> 2 banana     1     1 NA       NA  NA 
#> 3 carrot     2     2 carr      9  TRUE 

如何在 R 中模糊 LEFT 连接?

【问题讨论】:

  • 您确定您希望香蕉的值是col2 == 2col3 == 2。当我尝试fuzzy_left_join(df1, df2, match_fun = ci_str_detect, by = c(col1 = "col4")) 时,我得到structure(list(col1 = c("apple", "banana", "carrot"), col2 = c(0, 1, 2), col3 = c(0, 1, 2), col4 = c("app", NA, "carr"), col5 = c(5, NA, 9), matched = c(TRUE, NA, TRUE)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))
  • @biomiha 这就是答案,我不知道有一个fuzzy_left_join 函数。哇。您可以将其作为答案,我将标记为已解决。是的,我在上面也复制/粘贴/逻辑错误并已更正。谢谢你的一切。

标签: r join dplyr fuzzyjoin


【解决方案1】:

瞧 :)

fuzzy_left_join(df1, df2, match_fun = ci_str_detect, by = c(col1 = "col4"))

【讨论】:

  • 切线 - 你知道为什么"col1"col1 会在上面工作吗?同样的原因library(dplyr)library("dplyr") 会起作用吗?
  • 我不得不说,我从来没有完全清楚 NSE 的规则,但是是的,我认为这是最好的解释,即它可以评估未引用和引用的字符串。
  • 但我尝试df1 %&gt;% fuzzy_inner_join(df2, by = c("col1" = "col4"), match_fun = ci_str_detect),R 也得到了正确的小标题。也许以后的版本会解决这个问题。
猜你喜欢
  • 2020-03-02
  • 1970-01-01
  • 2017-01-31
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2020-07-28
  • 2021-02-06
相关资源
最近更新 更多