根据自定义条件合并数据框——字符串比较

Merge data frames based on custom condition - string comparison

我想合并两个数据框的行 - df1 和 df2 使用列 A:

 #df1   
    A <- c('ab','ab','bc','bc','bc','cd')
    B <- floor(runif(6, min=0, max=10))
    C <- floor(runif(6, min=0, max=10))
    D <- floor(runif(6, min=0, max=10))
    E <- c('a, b, c','a, d, e','a, g, h','d, e, f','a, d, f','f, j')
    df1 <- data.frame(A,B,C,D,E)
    df1
       A B C D        E
    1 ab 5 4 3  a, b, c
    2 ab 9 4 0  a, d, e
    3 bc 4 4 9  a, g, h
    4 bc 5 5 6  d, e, f
    5 bc 1 6 6  a, d, f
    6 cd 1 2 0     f, j

 #df2
   A <- c('ab','bc','cd')
   B <- floor(runif(3, min=0, max=10))
   E <- c('a, d','d, f','n, m')
   df2 <- data.frame(A,B,E)
   df2
   A B    E
   1 ab 4 a, d
   2 bc 7 d, f
   3 cd 1 n, m

我可以简单地做到:

df3 <- merge(x=df1, y=df2, by='A', all.x = TRUE)

但是有合并的条件。即,当 df2 所有 子字符串(第 E 列)是出现在 df1 中,因此输出应如下所示:

    df3
       A B C D        E  A.y  B.y  E.y
    1 ab 5 4 3  a, b, c  NA   NA   NA
    2 ab 9 4 0 a, d, e,  ab   6    a, d
    3 bc 4 4 9  a, g, h  NA   NA   NA
    4 bc 5 5 6  d, e, f  bc   7    d, f
    5 bc 1 6 6  a, d, f  bc   7    d, f
    6 cd 1 2 0     f, j  NA   NA   NA

我知道有一个选项使用 %in% 关于矢量比较。但是我有字符串,我应该先做一些 strsplitunlist 然后再进行比较吗?

这很乱,但应该可以满足您的需求:

首先,展开两个 E 值的行,然后按键列分组以检查 RHS E 中是否有任何值在 LHS E 中。然后根据查找 table.

进行过滤
library(tidyverse)

df3 <- merge(x=df1, y=df2, by='A', all.x = TRUE)
      
check_rows <- df3 %>% 
  separate_rows(E.y, sep = ',') %>% 
  separate_rows(E.x, sep = ',') %>% 
  mutate(E.x = trimws(E.x),
         E.y = trimws(E.y)) %>% 
  group_by(A) %>% 
  mutate(check = E.y %in% E.x,
         check = ifelse(any(check == TRUE), TRUE, FALSE)) %>% 
  select(A, check) %>% 
  unique() %>% 
  filter(check == TRUE)


df3 <- df3 %>% 
  filter(A %in% check_rows$A)