拆分字母序列,同时保留原始序列位置
Splitting sequence of letters, whilst retaining original sequence position
我需要将以下字母序列分成不同的块
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。
Zero-length 因使用 strsplit
中使用的仅前瞻模式而导致的匹配未得到正确处理。
在这种情况下,您还需要“锚定”左侧的匹配项。使用 non-word 边界,或不允许在字符串开头匹配的后视:
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"
\B(?=D)
模式匹配前面紧跟单词 char 且紧跟 D
.
的位置
(?<!^)(?=D)
模式匹配的位置不是紧跟在字符串位置的开头(即不在字符串的开头),而是紧跟在 D
.
另外,请注意 [P,A,G,S]
匹配 P
、A
、G
、S
和逗号 .您应该使用 [PAGS]
来匹配其中一个字母。
我需要将以下字母序列分成不同的块
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。
Zero-length 因使用 strsplit
中使用的仅前瞻模式而导致的匹配未得到正确处理。
在这种情况下,您还需要“锚定”左侧的匹配项。使用 non-word 边界,或不允许在字符串开头匹配的后视:
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"
\B(?=D)
模式匹配前面紧跟单词 char 且紧跟 D
.
(?<!^)(?=D)
模式匹配的位置不是紧跟在字符串位置的开头(即不在字符串的开头),而是紧跟在 D
.
另外,请注意 [P,A,G,S]
匹配 P
、A
、G
、S
和逗号 .您应该使用 [PAGS]
来匹配其中一个字母。