字符串与通配符匹配,尝试使用Biostrings包

时间:2014-09-02 13:47:11

标签: r

给定字符串patt

patt = "AGCTTCATGAAGCTGAGTNGGACGCGATGATGCG"

我们可以收集较短的子串str_col

str_col = substring(patt,1:(nchar(patt)-9),10:nchar(patt))

我们希望与subject1匹配:

subject1 = "AGCTTCATGAAGCTGAGTGGGACGCGATGATGCGACTAGGGACCTTAGCAGC"

patt中的“N”视为通配符(与subject1中的任何字母匹配),因此str_col中的所有子字符串都与subject1匹配。

我想在大型字符串数据库中进行这种字符串匹配,我发现BioconductorBiostrings非常有效。但是,为了提高效率,Biostrings要求您使用函数str_col将子字符串集合(此处为pdict)转换为类PDidc()的字典。您可以稍后在countPDict()等函数中使用此“词典”来计算与目标的匹配。

为了使用通配符,您必须将字典分为3个部分:头部(左侧),可信区域(中间)和尾部(右侧)。您只能在头部或尾部使用通配符,例如“N”,但不能在可信范围内使用通配符,并且您不能拥有宽度= 0的可信区域。因此,例如,str_col[15]将不匹配如果你使用最小宽度= 1的可信范围,如:

> PDict(str_col[1:15],tb.start=5,tb.end=5)
Error in .Call2("ACtree2_build", tb, pp_exclude, base_codes, nodebuf_ptr,  :
    non base DNA letter found in Trusted Band for pattern 15

因为“N”在可信范围内是正确的。请注意,这里的字符串是DNA序列,因此“N”是“匹配A,C,G或T”的代码。

> PDict(str_col[1:14],tb.start=5,tb.end=5) #is OK
TB_PDict object of length 14 and width 10 (preprocessing algo="ACtree2"):
    - with a head of width 4
    - with a Trusted Band of width 1
    - with a tail of width 5

有没有办法绕过Biostrings的这种限制?我还尝试使用R基函数执行此类任务,但我无法想出任何东西。

1 个答案:

答案 0 :(得分:1)

我估计你需要在某一时刻与IUPAC ambiguity code的其他一些外卡匹配,不是吗?

如果您需要完美匹配并且基本函数足够您,您可以使用与函数glob2rx()相同的技巧:只需使用gsub()转换来构造匹配模式。一个例子:

IUPACtoRX <- function(x){
  p <- gsub("N","\\[ATCG\\]",x)
  p <- gsub("Y","\\[CT\\]",p)  #match any pyrimidine
  # add the ambiguity codes you want here
  p
}

显然,你需要为你想要编程的每一个歧义提供一条线,但是我会说这很简单。

执行此操作,您可以执行以下操作:

> sapply(str_col, function(i) grepl(IUPACtoRX(i),subject1) )
AGCTTCATGA GCTTCATGAA CTTCATGAAG TTCATGAAGC TCATGAAGCT CATGAAGCTG ATGAAGCTGA 
      TRUE       TRUE       TRUE       TRUE       TRUE       TRUE       TRUE 
TGAAGCTGAG GAAGCTGAGT AAGCTGAGTN AGCTGAGTNG GCTGAGTNGG CTGAGTNGGA TGAGTNGGAC 
      TRUE       TRUE       TRUE       TRUE       TRUE       TRUE       TRUE 
GAGTNGGACG AGTNGGACGC GTNGGACGCG TNGGACGCGA NGGACGCGAT GGACGCGATG GACGCGATGA 
      TRUE       TRUE       TRUE       TRUE       TRUE       TRUE       TRUE 
ACGCGATGAT CGCGATGATG GCGATGATGC CGATGATGCG 
      TRUE       TRUE       TRUE       TRUE 

要查找匹配数,您可以使用例如gregexpr()

> sapply(str_col,function(i) sum(gregexpr(IUPACtoRX(i),subject1) > 0 ))
AGCTTCATGA GCTTCATGAA CTTCATGAAG TTCATGAAGC TCATGAAGCT CATGAAGCTG ATGAAGCTGA 
         1          1          1          1          1          1          1 
TGAAGCTGAG GAAGCTGAGT AAGCTGAGTN AGCTGAGTNG GCTGAGTNGG CTGAGTNGGA TGAGTNGGAC 
         1          1          1          1          1          1          1 
GAGTNGGACG AGTNGGACGC GTNGGACGCG TNGGACGCGA NGGACGCGAT GGACGCGATG GACGCGATGA 
         1          1          1          1          1          1          1 
ACGCGATGAT CGCGATGATG GCGATGATGC CGATGATGCG 
         1          1          1          1