我需要把下面的字母序列分成不同的块

SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC

我使用了前一个用户提供的以下代码来实现我最初想要的功能,即在每个C之后分割序列.

library(dplyr)

TestSequence <- "SCDKSFNRGECSCDKSFNRGECSCDKSFNRGEC"

Test <- strsplit(TestSequence, "(?<=[C])", perl = TRUE) %>% unlist 

df <- data.frame(Fragment = Test) %>%
  mutate("position" = cumsum(nchar(Test)))

这使我能够在每个C之后分割序列,并保留其在序列中的位置,例如位置2、11等处的C.

现在我需要在不同的位置拆分相同的序列,我可以使用以下方法在P、A、G或S之后拆分:

Test2 <- strsplit(TestSequence, "(?<=[P,A,G,S])", perl = TRUE) %>% unlist

如果我想在一个给定的字符之后分割它,这是可以的,但是如果我试图在一个字符之前分割它,例如D,我似乎无法在片段中保留D.只有在D之后拆分,我才能保留它.

我try 了我能想到的每一种"向后看"或"向前看"的组合,在每一个D之前和之后,下面的剪辑都不是很有用.

Test3 <- strsplit(TestSequence, "(?=[D])", perl = TRUE) %>% unlist

还有没有办法保持每个C在原始序列中的准确位置?

因此,如果我在初始K之后分割测试序列,我会得到一个片段,它是SCDK,我可以有一个单独的列,告诉我C在原始序列中的位置.正如第二个例子,下一个片段是SFNRGECSCDK,在另一列中,它会说C最初位于位置11.

推荐答案

由于使用strsplit中使用的仅前瞻模式而导致的零长度匹配未得到正确处理.

在这种情况下,您也需要在左侧"锚定"匹配.可以使用非单词边界,也可以使用禁止字符串开头匹配的查找:

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"  

online R demo.

\B(?=D)模式匹配一个位置,该位置前面紧跟着一个单词char,后面紧跟着D.

(?<!^)(?=D)模式与一个位置相匹配,该位置的前面不紧跟字符串起始位置(即不在字符串起始位置),后面紧跟D.

另外,请注意,[P,A,G,S]匹配PAGSand a comma.你应该用[PAGS]来匹配其中一个字母.

R相关问答推荐

使用预定值列表将模拟数量(n)替换为rnorm()

是否可以 Select 安装不带文档的R包以更有效地存储?

如果行和大于值,则过滤

用derrr在R中查找组间的重复项

在"gt"表中添加第二个"groupname_col",而不连接列值

将. xlsx内容显示为HTML表

可以替代与NSE一起使用的‘any_of()’吗?

在R gggplot2中是否有一种方法将绘图轴转换成连续的 colored颜色 尺度?

如何基于两个条件从一列中提取行

基于R中的间隔扩展数据集行

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

在具有多个响应变量的比例堆叠条形图上方添加总计

删除字符串R中的重复项

带RStatix的Wilcoxon环内检验

如何将EC50值绘制在R中的剂量-react 曲线上?

Ggplot2如何找到存储在对象中的残差和拟合值?

如何使用grepl()在数据帧列表中 Select 特定字符串?

如何获取R chromote中的当前URL?

将边列表转换为路径长度列表

把代码写成dplyr中的group_by/摘要更简洁吗?