解析字符串并将其拆分为R

时间:2018-04-10 12:20:29

标签: r regex strsplit

我在某种程度上处理R中的字符串的正则表达式问题。

我有RNAfold软件提供的数据结构,如下所示:

” ....(((..(((((((((((((((((((.........)))))))) )))。))))))))...)))..“

这是miRNA的典型二级结构,但我也有其他不是miRNA的序列,看起来很像这样:

...((((.....))))...........(((((((...((..(((..( (((...((((((.....))))))...)))))))))...))))))).. .....

第二个序列有两个发夹环,一个在开头,另一个在中间,而第一个序列在中间只有一个发夹环。

点(“。”)表示未配对的核苷酸,而“(”表示与其对应物配对的核苷酸,表示为“)”。

我想拆分这个字符串,以便我可以在结构中获取词干。

我想获得的输出是:

输入:

[1] "....(((..((((((((.(((((((((((.........))))))))))).))))))))..))).."

输出:

[1] "....(((..((((((((.(((((((((((........."
[2] "))))))))))).))))))))..))).."

这样我就可以计算分裂字符串的数量并计算字干数。

第二个序列的结果是:

输入:

[1] ...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......

输出:

[1] "...((((....."
[2] "))))...........(((((((...((..(((..((((...((((((....."
[3] ")))).))...)))).))).))...)))))))......."

因此,在我看来,我想要的是解析字符串,以便在它们找到“)”符号时将它们分开,保留字符串的所有符号。

我已经尝试过使用strplit()和一些正则表达式的变种,但我还是找不到诀窍......

任何帮助?

由于

3 个答案:

答案 0 :(得分:2)

您可以执行lookahead并查找以右括号结尾的点,该括号直接在左括号后面。

x <- c("....(((..((((((((.(((((((((((..))))))))))).))))))))..)))..", 
       "...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......")
strsplit(x, "\\((?=(\\.+\\)))", perl = TRUE)
# [[1]]
# [1] "....(((..((((((((.(((((((((("  "..))))))))))).))))))))..))).."
# 
# [[2]]
# [1] "...((("  ".....))))...........(((((((...((..(((..((((...((((("
# [3] ".....)))).))...)))).))).))...)))))))......."

答案 1 :(得分:0)

如果您想要计算角色,可能会更方便:

x <- "...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...)))))))......."


with(rle(strsplit(x, "")[[1]]), setNames(lengths, values))
##  .  (  .  )  .  (  .  (  .  (  .  (  .  (  .  )  .  )  .  )  .  )  .  )  .  )  . 
##  3  4  5  4 11  7  3  2  2  3  2  4  3  6  5  4  1  2  3  4  1  3  1  2  3  7  7 

答案 2 :(得分:0)

您可以使用 DavidArenburg&#39; 逻辑来获取您指定的输出,但有一个扭曲 - David 使用lookahead正则表达式来查找{ {1}}位于模式(之前,其中.{N})可以是任意数字。可变长度的lookbehind(其中pattern包含未指定的 a 字符的#)将是理想的但不起作用(读取 - 不允许)。诀窍是反转字符串以使用可变长度的前瞻,就像可变长度的lookbehind可能会运行一样。

数据

N

功能

S <- c("....(((..((((((((.(((((((((((.........))))))))))).))))))))..)))..", "...((((.....))))...........(((((((...((..(((..((((...((((((.....)))).))...)))).))).))...))))))).......")

结果

reverse_string <- function(S) {
    paste(rev(unlist(strsplit(S, ""))), collapse="")
}

myfun <- function(S) {
    T <- reverse_string(S)
    result <- unlist(strsplit(T, "\\)(?=(\\.+\\())", perl = TRUE))
    setNames(rev(sapply(result, function(i) reverse_string(i))), NULL)
}