通过grepl搜索一个不匹配的字符串

通过grepl搜索一个不匹配的字符串,r,bioinformatics,grepl,R,Bioinformatics,Grepl,我想在另一个字符串中搜索子字符串。输出必须是逻辑的,这就是为什么我假设grepl()将是最好的选择 要求是,函数必须检测两个模式完全匹配的字符串(字符串2和3),并且至少允许一个错误匹配(字符串1和3) 示例如下所示: 第1条:ABCDEFGHIJKL 第2条:ABDEFGHIJKL 第三条:ABDEFG 这意味着当字符串3是搜索模式时,函数必须同时检测字符串1和字符串2 另一个选项是Biostrings包的matchpattern()函数。但在这里,输出不是逻辑的,而是: 带有5个插槽的正式类

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

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

第1条:ABCDEFGHIJKL

第2条:ABDEFGHIJKL

第三条:ABDEFG

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

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

带有5个插槽的正式类“xstringview”[包“Biostrings”]

将其转换为逻辑文件的选项也会起作用

非常感谢

库(stringr)
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

    
stri
库(stringr)

stri纯粹是为了好玩,不确定是否适用于更长的琴弦:

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"

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

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"


s1可以试试
?agrepl
功能,非常感谢。答案是,agrepl(String3,c(String2,String1),max.distance=list(substitutions=1))可能会尝试
?agrepl
功能,非常感谢。答案是,agrepl(String3,c(String2,String1),max.distance=list(substitutions=1))嗯,这不是我的意思,我想用“ABD”检测c(“ABCDEF”,“ABCDEFG”)@Don Castanio,我编辑了答案,这是一个函数。谢谢你的回答,这也很有帮助:)@DonCastanio,如果它解决了你的问题,请点击答案旁边的勾号接受答案。嗯,这不是我的意思,我想用“ABD”@Don Castanio检测c(“ABCDEF”,“ABCDEFG”),我编辑了答案,这是一个函数。谢谢你的回答,这也很有帮助:)@DonCastanio,如果它解决了你的问题,请点击答案旁边的勾号接受答案。@Don Castanio,这是你问题的答案??!是的,@MrFlick所说的
agrepl
绝对是正确的简短答案,我的答案基于
stringr
包,结果与
agrepl
函数相同。但是接受这个答案太奇怪了,比尔,我真的同意你。如果@MrFlick将他的评论作为答案,我强烈建议给他分数。话虽如此,说(接受)我的答案很奇怪,但基本上给出了相同的答案,这本身就有点奇怪。因此我使用的答案是Flick先生的答案,因为他的答案是评论,所以他无法获得奖励,我试着至少奖励一个人。那么在这种情况下,谁会得到正确的答案呢points@Don卡斯塔尼奥没有人。你这么想真是太好了,我鼓励你奖励那些试图帮助别人的人的分数(就像你做的那样),但是如果答案来自评论,那么就必须对评论进行投票(我想你也是这么做的):-你可以随时要求评论人把他/她的评论放在回答中,以奖励分数。@Don Castanio,这是你的问题的答案??!是的,@MrFlick所说的
agrepl
绝对是正确的简短答案,我的答案基于
stringr
包,结果与
agrepl
函数相同。但是接受这个答案太奇怪了,比尔,我真的同意你。如果@MrFlick将他的评论作为答案,我强烈建议给他分数。话虽如此,说(接受)我的答案很奇怪,但基本上给出了相同的答案,这本身就有点奇怪。因此我使用的答案是Flick先生的答案,因为他的答案是评论,所以他无法获得奖励,我试着至少奖励一个人。那么在这种情况下,谁会得到正确的答案呢points@Don卡斯塔尼奥没有人。你这么想真是太好了,我鼓励你奖励尝试帮助的人的分数(就像你做的那样),但是如果答案来自评论,那么就必须对评论进行投票(我猜你也是这么做的):-你可以要求评论人将他/她的评论放在回答中,以奖励分数。