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
我有两个数据框,分别为
df1
和df2
。我需要为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 == 2
和col3 == 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"))
。 - biomihafuzzy_left_join
函数。哇。你可以把它作为答案,我会标记为已解决。是的,我之前复制/粘贴/逻辑错误,现在已经更正了。感谢你的帮助。 - Display name