【问题标题】:searching strings with one missmatch by grepl通过 grepl 搜索一个不匹配的字符串
【发布时间】:2021-05-21 06:44:52
【问题描述】:

我想在另一个字符串中搜索子字符串。输出必须是合乎逻辑的,这就是为什么我假设grepl() 是最好的选择。

要求是,该函数必须检测模式完全匹配的两个字符串(字符串 2 和 3),并且至少允许一个不匹配项(字符串 1 和 3)
一个示例如下所示:

字符串 1:ABCDEFGHIJKL

字符串 2:ABDEFGHIJKL

字符串 3:ABDEFG

意味着当字符串 3 是搜索模式时,函数必须同时检测字符串 1 和字符串 2。

另一个选项是 Biostrings 包的 matchpattern() 函数。但是在这里,输出不是一个逻辑而是一个:

Formal class 'XStringViews' [package "Biostrings"] with 5 slots

将其转换为逻辑的选项也可以。

非常感谢

【问题讨论】:

  • 不妨试试?agrepl函数
  • 非常感谢。答案是,agrepl(String3,c(String2,String1), max.distance=list(substitutions=1))

标签: r bioinformatics grepl


【解决方案1】:
library(stringr)
stri <- c("ABCDEFG", "ABCDEFGHGT", "ABFCDE", "saffaf")


str_match <- function(pattern, st_c) {
      logic_f <- NULL
      for (i in seq_along(st_c)){
        var <- strsplit(st_c[i], "")[[1]]
        det <- str_detect(pattern, var)
        logic <- ifelse(TRUE %in% det, TRUE, FALSE)
        logic_f <- append(logic_f, logic)
      }
      return(logic_f)
}


str_match("ABD", stri)
## [1]  TRUE  TRUE  TRUE FALSE

    

【讨论】:

  • hm,我不是这个意思,我想用 "ABD" 检测 c("ABCDEF", "ABCDEFG")
  • @Don Castanio,我编辑了答案,它是一个函数。
  • 谢谢你的回答,这也很有帮助:)
  • @DonCastanio,如果它解决了您的问题,请点击答案旁边的勾号接受答案。
【解决方案2】:

纯粹是为了好玩,不确定是否适用于更长的字符串:

S1<-"ABCDEFGHIJKL"

S2<-"ABDEFGHIJKL"

S3<-"ABDEFG"

find_partial_matching_string<-function(string, pattern){
  
  require(stringr)
  
  a<-vector()
  b<-vector()
  
  for (i in 1:nchar(string)){
    
    x<-str_sub(string, i, i)
    a<-c(a,x)
  }
  
  for(j in  1:nchar(pattern)){
    
    y<-str_sub(pattern, j, j)
    b<-c(b,y)
  }
  
  z <- a %in% b
 
  if(table(z[1:length(b)])<=1){
    return(string)     
  }
}

> find_partial_matching_string(string = S1, pattern = S3)
[1] "ABCDEFGHIJKL"
> find_partial_matching_string(string = S2, pattern = S3)
[1] "ABDEFGHIJKL"

【讨论】:

  • @Don Castanio,这是你的问题的答案??!是的,@MrFlick 关于agrepl 的说法绝对是正确的简短答案,而我的答案基于stringr 包,结果与agrepl 函数相同。但是接受这个答案太奇怪了。
  • @Killbill 我真的同意你的看法。如果@MrFlick 将他的评论放入答案中,我强烈建议给他积分。话虽如此,称(接受)我的答案很奇怪,而基本上给出相同的答案本身就有点奇怪。
  • 所以我使用的答案是 MrFlick 的答案,因为他的答案是评论,所以他无法获得奖励,我试图至少奖励一个人。所以在这种情况下谁会得到正确的答案
  • @Don Castanio 没有。你有这样的想法很好,我鼓励你奖励积分尝试帮助(就像你所做的那样),但如果答案来自评论,那么就必须对评论进行投票(正如你所做的那样): ) - 您可以随时要求评论者将他/她的评论放入答案中以奖励积分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 2018-08-08
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多