r语言 - 拆分字母序列,同时保留原序列位置



我需要将以下字母序列拆分为不同的块

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]来匹配其中一个字母。

最新更新