如何用R解析字符串(通过“新”标记)?

时间:2010-03-16 10:13:00

标签: string parsing r loops

我想用R来做字符串解析(我认为)就像一个简单的HTML解析。

例如,假设我们有以下两个变量:

Seq <- "GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA"
Str <- ">>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<."

假设我要解析“Seq”根据“Str”,使用此处的图例

Seq: GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGGCA
Str: >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
     |     |  |              | |               |     |               ||     |
     +-----+  +--------------+ +---------------+     +---------------++-----+
        |        Stem 1            Stem 2                 Stem 3         |
        |                                                                |
        +----------------------------------------------------------------+
                                Stem 0

假设我们总是有4个词干(0到3),但每个词之前和之后的字母长度都可以。

输出应该类似于以下列表结构:

list(
    "Stem 0 opening" = "GCCTCGA",
    "before Stem 1" = "TA",
    "Stem 1" = list(opening = "GCTC",
                inside = "AGTTGGGA",
                closing = "GAGC"
            ),
    "between Stem 1 and 2" = "G",
    "Stem 2" = list(opening = "TACGA",
                inside = "CTGAAGA",
                closing = "TCGTA"
            ),
    "between Stem 2 and 3" = "AGGtC",
    "Stem 3" = list(opening = "ACCAG",
                inside = "TTCGATC",
                closing = "CTGGT"
            ),
    "After Stem 3" = "",
    "Stem 0 closing" = "TCGGGGC"
)

我没有与编程解析器的经验,并希望建议以编程这样的事情时(以及任何建议R命令使用)要使用的策略。

我在想的是先摆脱“干0”,然后再通过内部串用递归函数(我们称之为“seperate.stem”),每次将字符串分割成的: 干之前 打开杆 内茎 关闭干 5.干后

然后将“after stem”递归地输入到同一个函数中(“seperate.stem”)

问题是我不知道如何在不使用循环的情况下尝试编码。

任何建议都会受到欢迎。

更新:有人向我发了一堆问题,他们来了。

问:每个序列是否具有相同数量的“&gt;&gt;&gt;&gt;”对于打开序列,就像它对“&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;结束序列?
答:是的

问:解析是否始终以部分词干0开头,如您的示例所示? 答:不会。有时它会以一些“。”开头。

问:有没有办法确保您在开始时拥有正确的序列? 答:我不确定我明白你的意思。

问:您必须重新启动字符串中间是否有错误? 答:可悲的是,是的。在这种情况下,我需要忽略其中一个内部干扰......

问:您要解析这些字符串多长时间? 答:每个字符串有60到150个字符(我有成千上万个字符......)

问:每个人都是一个自包含的序列,就像你在你的例子中所显示的一样,或者它们是否继续存在数千个字符? 答:每个序列都是自包含的。

问:总是至少有一个'。'茎之间?
答:没有。

问:有关如何进行解析的完整规则将非常有用。 答:我同意。但因为我没有对如何开始编码这甚至一个基本的想法,我认为首先要对开始一些帮助,并尝试与其他情况下的调整,将拿出义无反顾的帮助了。

问:你有解析的BNF语法吗? 答:不会。您的电子邮件是我第一次遇到它(http://en.wikipedia.org/wiki/Backus - Naur_Form)。

1 个答案:

答案 0 :(得分:2)

您可以使用行程编码来简化任务。

首先,将Str转换为单个字符的向量,然后调用rle

split_Str <- strsplit(Str, "")[[1]]
rle_Str <- rle(split_Str)

Run Length Encoding
  lengths: int [1:14] 7 2 4 8 4 1 5 7 5 5 ...
  values : chr [1:14] ">" "." ">" "." "<" "." ">" "." "<" "." ">" "." "<" "."

现在你只需要解析rle_Str$values,这可能更简单。例如,内部干将始终看起来像">" "." "<"

我认为您需要考虑的主要问题是数据的结构。 "."总是必须介于">""<"之间,还是可选的?你有一个"."吗?您是否需要能够在茎中的茎内,或甚至更复杂的结构中推广茎?

一旦解决了这个问题,构建列表输出应该很简单。

另外,不要担心使用循环,它们是语言,因为它们很有用。让事情先行,然后担心速度优化(如果你真的需要)。