R 如何在多个未列出的字符串中查找匹配值?

R 如何在多个未列出的字符串中查找匹配值?,r,string,dataframe,strsplit,R,String,Dataframe,Strsplit,我有两个数据集: #df1: Gene interactors ACE BRCA, HER2 NOS NA, NA P53 NA CDON TGBP df2: Gene interactors AGT NOS, HER2 NPKB CDON P70 GPC IK TGBP 我正在寻找确定df1中作为df2下的相互作用者列出的基因,并确定df1中与df2中的相互作用者匹配的相互作用者的基因 输出: Ge

我有两个数据集:

#df1:
Gene   interactors
ACE      BRCA, HER2
NOS       NA, NA
P53       NA
CDON      TGBP

df2:
Gene   interactors
AGT      NOS, HER2
NPKB     CDON
P70      GPC
IK       TGBP
我正在寻找确定df1中作为df2下的相互作用者列出的基因,并确定df1中与df2中的相互作用者匹配的相互作用者的基因

输出:

Gene   interactors     matched_gene_interactor   matched_interactor_interactor
ACE      BRCA, HER2         FALSE                        TRUE                      
NOS       NA, NA            TRUE                         FALSE
P53       NA                FALSE                        FALSE
CDON      TGBP              TRUE                         TRUE

#ACE has an interactor (HER2) in both df1 and df2
#NOS matches itself as an interactor in df2
#CDON matches itself as an interactor in df2 and as having an interactor (TGBP) in both df1 and df2
我已经能够通过编码获得
matched\u gene\u interactitor
列:

df1$matched_gene_interactor <-  df1$Gene %in% unlist(strsplit(df2$interactors, ", "))
如何匹配具有未列出字符串拆分的两个数据集?我有生物学背景,所以不知道从哪里开始

输入数据示例:

df1:

structure(list(Gene = c("ACE", "NOS", "P53", "CDON"), interactors = c("BRCA, HER2", 
"NA, NA", NA, "TGBP")), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"))

df2:

structure(list(Gene = c("AGT", "NPKB", "P70", "IK"), interactors = c("NOS, HER2", 
"CDON", "GPC", "TGBP")), row.names = c(NA, -4L), class = c("data.table", 
"data.frame"))


您可以在逗号上拆分
df2
interactiors
,对于每一行,检查
df1
中的
interactiors
是否存在任何值

temp <- unlist(strsplit(df2$interactors, ', '))
df1$matched_interactor_interactor <- sapply(strsplit(df1$interactors, ', '), 
                                      function(x) any(x %in% temp))

df1
#   Gene interactors matched_gene_interactor matched_interactor_interactor
#1:  ACE  BRCA, HER2                   FALSE                          TRUE
#2:  NOS      NA, NA                    TRUE                         FALSE
#3:  P53        <NA>                   FALSE                         FALSE
#4: CDON        TGBP                    TRUE                          TRUE
temp <- unlist(strsplit(df2$interactors, ', '))
df1$matched_interactor_interactor <- sapply(strsplit(df1$interactors, ', '), 
                                      function(x) any(x %in% temp))

df1
#   Gene interactors matched_gene_interactor matched_interactor_interactor
#1:  ACE  BRCA, HER2                   FALSE                          TRUE
#2:  NOS      NA, NA                    TRUE                         FALSE
#3:  P53        <NA>                   FALSE                         FALSE
#4: CDON        TGBP                    TRUE                          TRUE
grepl(paste0('\\b', temp, '\\b', collapse = '|'), df1$interactors)
#[1]  TRUE FALSE FALSE  TRUE