【问题标题】:How to finding matching values in multiple unlists of strings?如何在多个字符串列表中查找匹配值?
【发布时间】:2020-06-25 08:32:00
【问题描述】:

我有两个数据集:

#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 下的相互作用子的基因,并用与 df2 中的相互作用子相匹配的相互作用子识别 df1 中的基因

输出:

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_gene_interactor 列:

df1$matched_gene_interactor <-  df1$Gene %in% unlist(strsplit(df2$interactors, ", "))

但我无法获得第二个 matched_interactor_interactor 专栏

我已经尝试了一些东西,但还没有找到如何让它达到我想要的第二列的地步,例如:

df1interactors <-  unlist(strsplit(df1$interactors, ", "))
df2interactors <-  unlist(strsplit(df2$interactors, ", "))
matched_interactor_interactor <-  df1interactors %in% df2interactors

如何匹配具有未列出的字符串拆分的两个数据集?我有生物学背景,所以不知道从哪里开始。

示例输入数据:

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"))

【问题讨论】:

    标签: r string dataframe strsplit


    【解决方案1】:

    您可以用逗号分隔interactorsdf2,并检查每一行中是否存在来自df1interactors 的任何值。

    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
    

    如果df2$interactors 不是很大,您也可以通过创建动态正则表达式模式来执行此操作而无需拆分df1$interactors

    grepl(paste0('\\b', temp, '\\b', collapse = '|'), df1$interactors)
    #[1]  TRUE FALSE FALSE  TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多