r中另一个数据帧中的部分字符串匹配

r中另一个数据帧中的部分字符串匹配,r,dplyr,match,R,Dplyr,Match,有没有办法找到从df_2到df_1的所有部分匹配 部分匹配(如果DF_1字符串的一部分在DF_2的整个字符串中) 例如,“For solution”的一部分在“solution”的整个字符串中 这听起来像是grepl()的工作 例如,grepl(值、字符、固定=真) 让我引述 字符值grepl(值,字符) [1] 真的 >字符值grepl(值,字符) [1] 假的 这听起来像是grepl()的工作。 例如,grepl(值、字符、固定=真) 让我引述 字符值grepl(值,字符) [1] 真的 >

有没有办法找到从df_2到df_1的所有部分匹配

部分匹配(如果DF_1字符串的一部分在DF_2的整个字符串中) 例如,“For solution”的一部分在“solution”的整个字符串中


这听起来像是
grepl()
的工作

例如,
grepl(值、字符、固定=真)
让我引述

字符值grepl(值,字符) [1] 真的 >字符值grepl(值,字符) [1] 假的
这听起来像是
grepl()的工作。

例如,
grepl(值、字符、固定=真)
让我引述

字符值grepl(值,字符) [1] 真的 >字符值grepl(值,字符) [1] 假的
我们可以使用
fuzzyjoin

library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))

我们可以使用
fuzzyjoin

library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))

遵循@Akrun建议使用
fuzzyjoin

library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
根据预期的输出,您希望加入两次,并希望执行
内部\u-join
。 最后,如果存在完美匹配,您将进行两次匹配,这就是您希望重复数据消除的原因(我使用
distinct
from
dplyr
进行了重复数据消除,但您可以根据需要执行重复数据消除

df_out = distinct(
  rbind(
    regex_inner_join(df_1, df_2, by = c("DF_1"= "DF_2")),
    regex_inner_join(df_2, df_1, by = c("DF_2"= "DF_1"))
  )
)
df_out
输出为:

          DF_1 index           DF_2
1   suspension     2     suspension
2 for solution     3       solution
3   suspension     1 for suspension
4       tablet     4      tablet,ER
5       tablet     5      tablet,IR

您发现您期望的表,但顺序(行和列)不同。

遵循@Akrun建议使用
fuzzyjoin

library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
根据预期的输出,您希望加入两次,并希望执行
内部\u-join
。 最后,如果存在完美匹配,您将进行两次匹配,这就是您希望重复数据消除的原因(我使用
distinct
from
dplyr
进行了重复数据消除,但您可以根据需要执行重复数据消除

df_out = distinct(
  rbind(
    regex_inner_join(df_1, df_2, by = c("DF_1"= "DF_2")),
    regex_inner_join(df_2, df_1, by = c("DF_2"= "DF_1"))
  )
)
df_out
输出为:

          DF_1 index           DF_2
1   suspension     2     suspension
2 for solution     3       solution
3   suspension     1 for suspension
4       tablet     4      tablet,ER
5       tablet     5      tablet,IR

您可以找到所需的表,但顺序(行和列)不同。

这里有一个使用嵌套
*apply的基本R选项。
+
grepl

df_out <- within(
  df_2,
  DF_1 <- unlist(sapply(
    DF_2,
    function(x) {
      Filter(
        Negate(is.na),
        lapply(
          df_1$DF_1,
          function(y) ifelse(grepl(y, x), y, ifelse(grepl(x, y), x, NA))
        )
      )
    }
  ), use.names = FALSE)
)

下面是一个使用嵌套的
*apply
+
grepl

df_out <- within(
  df_2,
  DF_1 <- unlist(sapply(
    DF_2,
    function(x) {
      Filter(
        Negate(is.na),
        lapply(
          df_1$DF_1,
          function(y) ifelse(grepl(y, x), y, ifelse(grepl(x, y), x, NA))
        )
      )
    }
  ), use.names = FALSE)
)

您如何定义部分匹配?根据您的示例,是否“df_a中的字符串链完全包含在df_b中”?这是否回答了您的问题?@Arault,我在上面定义了部分匹配。如果我在df_1中的字符串的一部分在df_2中。例如,“for solution”的一部分在“solution”中,所以这是一个匹配。@Ashti在这种情况下,不应该将“for solution”与“for suspension”合并吗?两者都有“for”否,因为“for solution”的一部分作为一个整体存在于“solution”中,而不是“for suspension”作为一个整体存在于“solution”中。您如何定义部分匹配?根据您的示例,是否应该是“df_a中的字符串链完全包含在df_b中?”?这回答了你的问题吗?@Arault,我在上面定义了一个部分匹配。如果我在DF_1中的字符串的一部分在DF_2中。例如,“for solution”的一部分在“solution”中,那么这是一个匹配。@Ashti在这种情况下,“for solution”不应该与“for suspension”合并吗?两者都有“for”否,因为“for solution”的一部分在“solution”中作为一个整体,但不是作为整个字符串的“for suspension”。谢谢!这没有返回其中一行的匹配项。谢谢!这没有返回其中一行的匹配项。