我的问题是我需要在一个字符串中找到一个位置,我的字符块应该只是一个字符位置。我正在使用核苷酸序列,我需要跟踪序列中的位置,但我有一些位置,其中有变体已被表示为[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。我可以插入一个条件来分割每个字符,除非用方括号括起来,这应该作为一个块保存吗?
答案 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]"
这应该有效。