Частичное совпадение строки в другом фрейме данных в r - PullRequest
1 голос
/ 04 августа 2020

Есть ли способ найти все частичные совпадения от df_2 до df_1?

частичное совпадение (если часть строки DF_1 находится во всей строке DF_2) Например, часть «для решения "находится во всей строке" решение "

df_1=data.frame(
  DF_1=c("suspension","tablet","for solution","capsule")
)

df_2=data.frame(
  index=c("1","2","3","4","5"),
  DF_2=c("for suspension", "suspension", "solution", "tablet,ER","tablet,IR")
)

df_out=data.frame(
  DF_1=c("suspension","suspension","tablet","tablet","for solution"),
  DF_2=c("for suspension", "suspension","tablet,ER","tablet,IR","solution"),
  index=c("1","2","4","5","3")
)

Ответы [ 4 ]

1 голос
/ 05 августа 2020

Вот базовый вариант R с вложенными *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_out
  index           DF_2       DF_1
1     1 for suspension suspension
2     2     suspension suspension
3     3       solution   solution
4     4      tablet,ER     tablet
5     5      tablet,IR     tablet
1 голос
/ 05 августа 2020

Мы можем использовать fuzzyjoin

library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
1 голос
/ 05 августа 2020

Следуя предложению @Akrun об использовании fuzzyjoin

Согласно вашему ожидаемому результату, вы хотите присоединиться дважды, и вы хотите выполнить inner_join. Наконец, вы дважды сопоставите, если будет идеальное совпадение, поэтому вы хотите дедуплицировать (я сделал это с distinct из 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

Вы найдете ожидаемую таблицу, но не в том же порядке (строки и столбцы).

0 голосов
/ 05 августа 2020

Звучит как работа для grepl()!

Например, grepl(value, chars, fixed = TRUE) Позвольте мне процитировать пример из другого ответа:

> chars <- "test"
> value <- "es"
> grepl(value, chars)
[1] TRUE
> chars <- "test"
> value <- "et"
> grepl(value, chars)
[1] FALSE
...