我想用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)。
答案 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
,这可能更简单。例如,内部干将始终看起来像">" "." "<"
。
我认为您需要考虑的主要问题是数据的结构。 "."
总是必须介于">"
和"<"
之间,还是可选的?你有一个"."
吗?您是否需要能够在茎中的茎内,或甚至更复杂的结构中推广茎?
一旦解决了这个问题,构建列表输出应该很简单。
另外,不要担心使用循环,它们是语言,因为它们很有用。让事情先行,然后担心速度优化(如果你真的需要)。