我有一些氨基酸修饰,类似于:

example <- c('_(Acetyl (Protein N-term))DDDIAAM(Oxidation (M))CK_')

我想将这样的序列分成类似于以下的状态:

example2 <- c('_','(Acetyl (Protein N-term))','D','D','D','I','A','A','M','(Oxidation (M))','C','K','_')

但我不知道如何在将内容保留在括号内的同时拆分这样的字符串,有什么函数或代码可以帮助我做到这一点吗?

谢谢, 李莉

推荐答案

Update

borrow @benson23的 idea 插入一个特殊字符,例如@,我们可以try 使用strsplit+嵌套(g)sub的代码

unlist(
  lapply(
    unlist(
      strsplit(
        sub(
          "(.*)\\)", "\\1)@",
          sub(
            "\\(", "@(",
            gsub("(\\))([^()]+)(\\()", "\\1@\\2@\\3", example)
          )
        ), "@"
      )
    ),
    function(s) {
      if (startsWith(s, "(")) {
        s
      } else {
        strsplit(s, "")
      }
    }
  )
)

下面是一个庞大的实现,用于查找成对的括号并进行拆分

# split string by characters
v <- unlist(strsplit(example, ""))

# positions of "(" and ")"
a <- which(v == "(")
b <- which(v == ")")

# split as per the position of ")"
lst1 <- split(v, cumsum(replace(rep(0, length(v)), 1 + by(b, findInterval(b, a), max), 1)))

# split as per the position of "("
lst2 <- unlist(lapply(lst1, function(x) split(x, cumsum(x == "(") > 0)), recursive = FALSE)

# output
res <- unlist(
  lapply(
    lst2,
    function(s) {
      if (s[1] == "(") {
        paste0(s, collapse = "")
      } else {
        s
      }
    }
  ),
  use.names = FALSE
)

Test

让我们来试一试复杂的example <- c("_(Acetyl (Protein (N-term)) XXX) DDDIAAM(Oxidation (M))CK_"),我们将res看作

 [1] "_"                               "(Acetyl (Protein (N-term)) XXX)"
 [3] " "                               "D"
 [5] "D"                               "D"
 [7] "I"                               "A"
 [9] "A"                               "M"
[11] "(Oxidation (M))"                 "C"
[13] "K"

R相关问答推荐

过滤Expand.Grid的结果

无法将传奇添加到cowplot多情节中

derrr summarise每个组返回多行?

使用case_match()和char数组重新编码值

如何直接从R中的风险分数计算c指数?

R函数‘paste`正在颠倒其参数的顺序

在数组索引上复制矩阵时出错

2个Rscript.exe可执行文件有什么区别?

如何将R中数据帧中的任何Nas替换为最后4个值

使用R中的dist()迭代ID匹配的欧几里德距离

按时间顺序对不同事件进行分组

汇总数据的Sheffe检验的P值(平均值和标准差)

从多层嵌套列表构建Tibble?

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

将全局环境变量的名称分配给列表中的所有元素

在R中使用列表(作为tibble列)进行向量化?

R中时间间隔的大向量与参考时间间隔的相交

根据r中每行中的日期序列,使用列名序列创建新列

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

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