R索引字符串,其中包含表示核苷酸变体的字符块

时间:2015-06-30 19:38:53

标签: regex r string bioinformatics

我的问题是我需要在一个字符串中找到一个位置,我的字符块应该只是一个字符位置。我正在使用核苷酸序列,我需要跟踪序列中的位置,但我有一些位置,其中有变体已被表示为[A / T],其中A或T可能存在,具体取决于哪个序列我关心(这是两个相似的DNA序列,它们在整个序列的几个位置上变化)。因此,对于这些变体网站中的每一个,序列的长度是额外的四个字符/位置更长。

我知道我可以通过制作一个新的代码来解决这个问题,其中[A / T]可以转换为,例如X和[T / A]由Y表示,但这会让人感到困惑,因为已经有了标准简并码,但它不会跟踪哪个核苷酸来自哪个菌株(对于我来说,/来自菌株A之前的那个和/来自菌株B之后的那个)。我想以某种方式索引这个DNA序列字符串,我在想这个:

如果我有一个字符串:

dna <- "ATC[A/T]G[G/C]ATTACAATCG"

我想获得一个table / data.frame:

pos nuc
1   A
2   T
3   C
4   [A/T]
5   G
6   [G/C]
... and so on

如果我更了解正则表达式,我觉得我可以用某种方式使用strplit。我可以插入一个条件来分割每个字符,除非用方括号括起来,这应该作为一个块保存吗?

4 个答案:

答案 0 :(得分:6)

library('stringr')
df <- as.data.frame(strsplit(gsub("\\[./.\\]", '_', dna), ''), stringsAsFactors=F)
df[,1][df[,1] == '_'] <- str_extract_all(dna, "\\[./.\\]")[[1]];names(df) <- 'nuc'
df
#      nuc
# 1      A
# 2      T
# 3      C
# 4  [A/T]
# 5      G
# 6  [G/C]
# 7      A
# 8      T
# 9      T
# 10     A
# 11     C
# 12     A
# 13     A
# 14     T
# 15     C
# 16     G

答案 1 :(得分:5)

我是喜欢保持简单的人,这是一个简短的技巧...

x <- 'ATC[A/T]G[G/C]ATTACAATCG'
data.frame(nuc = regmatches(x, gregexpr('\\[[^]]*]|.', x))[[1]])

#      nuc
# 1      A
# 2      T
# 3      C
# 4  [A/T]
# 5      G
# 6  [G/C]
# 7      A
# 8      T
# 9      T
# 10     A
# 11     C
# 12     A
# 13     A
# 14     T
# 15     C
# 16     G

上面的正则表达式使用交替,在左侧我们匹配方括号内的子串,在右侧我们使用匹配任何单个字符的.

答案 2 :(得分:3)

这是另一个

dna <- "ATC[A/T]G[G/C]ATTACAATCG"

(tmp <- gsub('(\\w)(\\w)','~\\1~\\2~', dna))
# [1] "~A~T~C[A/T]G[G/C]~A~T~~T~A~~C~A~~A~T~~C~G~"

(nuc <- Filter(nzchar, strsplit(gsub("(\\[.+?\\])","~\\1~", tmp), '~')[[1]]))
# [1] "A"     "T"     "C"     "[A/T]" "G"     "[G/C]" "A"     "T"     "T"    
# [10] "A"     "C"     "A"     "A"     "T"     "C"     "G"

data.frame(nuc)
#      nuc
# 1      A
# 2      T
# 3      C
# 4  [A/T]
# 5      G
# 6  [G/C]
# 7      A
# 8      T
# 9      T
# 10     A
# 11     C
# 12     A
# 13     A
# 14     T
# 15     C
# 16     G

答案 3 :(得分:1)

这是一种简单的方法,可以将所有内容排除在括号中:

strsplit(dna, '\\[[A-Z]/[A-Z]\\]')

[[1]]
[1] "ATC"        "G"          "ATTACAATCG"

也许否定那会在括号内给你任何东西,或者在我列出的参数中使用正则表达式。

编辑: 以下代码将为您提供括号中的内容:

lbracket <- as.numeric(unlist(gregexpr('\\[', dna)))
rbracket <- as.numeric(unlist(gregexpr('\\]', dna)))
mapply(function(x, y) substr(dna, start=x, stop=y), lbracket, rbracket)

[1] "[A/T]" "[G/C]"

这应该有效。