我需要将以下字母序列拆分为不同的块
SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC
我使用了以前的用户提供的以下代码来实现我最初想要的,即在每个c之后拆分序列。
library(dplyr)
TestSequence <- "SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC"
Test <- strsplit(TestSequence, "(?<=[C])", perl = TRUE) %>% unlist
df <- data.frame(Fragment = Test) %>%
mutate("position" = cumsum(nchar(Test)))
这允许我在每个C之后分割序列并保留它在序列中的位置,例如C在位置2,11等。
现在我需要在不同的位置分割相同的序列,我可以使用以下命令在p,A,G或S之后分割:
Test2 <- strsplit(TestSequence, "(?<=[P,A,G,S])", perl = TRUE) %>% unlist
如果我想让它在给定字符之后分割,这是可以的,但如果我试图在字符(例如D)之前分割它,我似乎无法保留片段中的D。我只能保留它,如果它在d之后被分割。
我已经尝试了我能想到的每一个向后看或向前看的组合,下面是每个D之前和之后的切割,这不是那么有用。
Test3 <- strsplit(TestSequence, "(?=[D])", perl = TRUE) %>% unlist
是否有一种方法可以保留原始序列中每个C的确切位置?
所以如果我要在初始K之后拆分测试序列,我将有一个片段是SCDK,我可以有一个单独的列来告诉我C在原始序列中的位置吗?就像第二个例子一样,下一个片段将是SFNRGECSCDK,在单独的列中,它会说C最初位于位置11。
在strsplit
中使用的仅向前看模式导致的零长度匹配不能正确处理。
在这种情况下,您需要"anchor"左边的火柴也是。要么使用非单词边界,要么使用禁止在string:
开头匹配的查找。TestSequence <- "SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC"
strsplit(TestSequence, "\B(?=D)", perl = TRUE)
# => [[1]]
# => [1] "SC" "DKSFNRGECSC" "DKSFNRGECSC" "DKSFNRGEC"
strsplit(TestSequence, "(?<!^)(?=D)", perl = TRUE)
# => [[1]]
# => [1] "SC" "DKSFNRGECSC" "DKSFNRGECSC" "DKSFNRGEC"
查看在线R演示。
B(?=D)
模式匹配前面紧接一个字字符,后面紧接D
的位置。
(?<!^)(?=D)
模式匹配的位置前面没有紧接字符串的开始位置(即不在字符串的开始位置),然后紧接D
。
另外,请注意[P,A,G,S]
匹配P
,A
,G
,S
和逗号。您应该使用[PAGS]
来匹配其中一个字母。