<div dir="ltr">Wow, Thank you very much Andrej!<div><br></div><div>Tal<br><div><br>----------------Contact Details:-------------------------------------------------------<br>Contact me: <a href="mailto:Tal.Galili@gmail.com">Tal.Galili@gmail.com</a> |  972-52-7275845<br>

Read me: <a href="http://www.talgalili.com">www.talgalili.com</a> (Hebrew) | <a href="http://www.biostatistics.co.il">www.biostatistics.co.il</a> (Hebrew) | <a href="http://www.r-statistics.com">www.r-statistics.com</a> (English)<br>

----------------------------------------------------------------------------------------------<br><br><br>
<br><br><div class="gmail_quote">2010/3/17 Andrej Blejec <span dir="ltr">&lt;<a href="mailto:Andrej.Blejec@nib.si">Andrej.Blejec@nib.si</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

A version using regular expressions, lot of regexpr() and substr() functions is attached.<br>
Finally everything is packed into splitSeq() function<br>
<br>
Andrej<br>
<br>
--<br>
Andrej Blejec<br>
National Institute of Biology<br>
Vecna pot 111 POB 141<br>
SI-1000 Ljubljana<br>
SLOVENIA<br>
e-mail: <a href="mailto:andrej.blejec@nib.si">andrej.blejec@nib.si</a><br>
URL: <a href="http://ablejec.nib.si" target="_blank">http://ablejec.nib.si</a><br>
tel: + 386 (0)59 232 789<br>
fax: + 386 1 241 29 80<br>
--------------------------<br>
Local Organizer of ICOTS-8<br>
International Conference on Teaching Statistics<br>
<a href="http://icots8.org" target="_blank">http://icots8.org</a><br>
<div><div></div><div class="h5"><br>
<br>
<br>
&gt; -----Original Message-----<br>
&gt; From: <a href="mailto:r-help-bounces@r-project.org">r-help-bounces@r-project.org</a> [mailto:<a href="mailto:r-help-bounces@r-">r-help-bounces@r-</a><br>
&gt; <a href="http://project.org" target="_blank">project.org</a>] On Behalf Of Gabor Grothendieck<br>
&gt; Sent: Tuesday, March 16, 2010 3:24 PM<br>
&gt; To: Tal Galili<br>
&gt; Cc: <a href="mailto:r-help@r-project.org">r-help@r-project.org</a>; <a href="mailto:seqinr-forum@r-forge.wu-wien.ac.at">seqinr-forum@r-forge.wu-wien.ac.at</a><br>
&gt; Subject: Re: [R] How to parse a string (by a &quot;new&quot; markup) with R ?<br>
&gt;<br>
&gt; We show how to use the gsubfn package to parse this.<br>
&gt;<br>
&gt; The rules are not entirely clear so we will assume the following:<br>
&gt;<br>
&gt; - there is a fixed template for the output which is the same as your<br>
&gt; output but possibly with different character strings filled in.  This<br>
&gt; implies, for example, that there are exactly Stem0, Stem1, Stem2 and<br>
&gt; Stem3 and no fewer or more stems.<br>
&gt;<br>
&gt; - the sequence always starts with the open of Stem0, at least one dot<br>
&gt; and the open of Stem1.  There are no dots prior to the open of Stem0.<br>
&gt; This seems to be implicit in your sample output since there is no zero<br>
&gt; length string in your sample output corresponding to dots prior to<br>
&gt; Stem0.<br>
&gt;<br>
&gt; - Stem0 closes with the same number of &lt; as there are &gt; to open it<br>
&gt;<br>
&gt; You can modify this yourself to take into account the actual rules<br>
&gt; whatever they are.<br>
&gt;<br>
&gt; We first calculate, k, the number of leading &gt;&#39;s using strapply.<br>
&gt;<br>
&gt; Then we replace the leading k &gt;&#39;s with }&#39;s and the trailing k &lt;&#39;s with<br>
&gt; {&#39;s giving us Str3:<br>
&gt;<br>
&gt;<br>
&gt; &quot;}}}}}}}..&gt;&gt;&gt;&gt;........&lt;&lt;&lt;&lt;.&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;.....&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;{{{{{<br>
&gt; {{.&quot;<br>
&gt;<br>
&gt; We again use strapply, this time to get the lengths of the runs.  Note<br>
&gt; that<br>
&gt; zero length runs are possible so we cannot, for example, use rle for<br>
&gt; this.  For<br>
&gt; example there is a zero length run of dots between the last &lt; and the<br>
&gt; first {.<br>
&gt; read.fwf is used to actually parse out the strings using the lengths we<br>
&gt; just<br>
&gt; calculated.<br>
&gt;<br>
&gt; Finally we fill in the template using relist.<br>
&gt;<br>
&gt; # inputs<br>
&gt;<br>
&gt; Seq &lt;-<br>
&gt; &quot;GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGG<br>
&gt; GCA&quot;<br>
&gt; Str &lt;-<br>
&gt; &quot;&gt;&gt;&gt;&gt;&gt;&gt;&gt;..&gt;&gt;&gt;&gt;........&lt;&lt;&lt;&lt;.&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;.....&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br>
&gt; &lt;&lt;.&quot;<br>
&gt; template &lt;-<br>
&gt;   list(<br>
&gt;     &quot;Stem 0 opening&quot; = &quot;&quot;,<br>
&gt;     &quot;before Stem 1&quot; = &quot;&quot;,<br>
&gt;     &quot;Stem 1&quot; = list(opening = &quot;&quot;,<br>
&gt;     inside = &quot;&quot;,<br>
&gt;     closing = &quot;&quot;<br>
&gt;     ),<br>
&gt;     &quot;between Stem 1 and 2&quot; = &quot;&quot;,<br>
&gt;     &quot;Stem 2&quot; = list(opening = &quot;&quot;,<br>
&gt;     inside = &quot;&quot;,<br>
&gt;     closing = &quot;&quot;<br>
&gt;     ),<br>
&gt;     &quot;between Stem 2 and 3&quot; = &quot;&quot;,<br>
&gt;     &quot;Stem 3&quot; = list(opening = &quot;&quot;,<br>
&gt;     inside = &quot;&quot;,<br>
&gt;     closing = &quot;&quot;<br>
&gt;     ),<br>
&gt;     &quot;After Stem 3&quot; = &quot;&quot;,<br>
&gt;     &quot;Stem 0 closing&quot; = &quot;&quot;<br>
&gt;    )<br>
&gt;<br>
&gt; # processing<br>
&gt;<br>
&gt; # create string made by repeating string s k times followed by more<br>
&gt; reps &lt;- function(s, k, more = &quot;&quot;) {<br>
&gt;       paste(paste(rep(s, k), collapse = &quot;&quot;), more, sep = &quot;&quot;)<br>
&gt; }<br>
&gt;<br>
&gt; library(gsubfn)<br>
&gt; k &lt;- nchar(strapply(Str, &quot;^&gt;+&quot;, c)[[1]])<br>
&gt; Str2 &lt;- sub(&quot;^&gt;+&quot;, reps(&quot;}&quot;, k), Str)<br>
&gt; Str3 &lt;- sub(reps(&quot;&lt;&quot;, k, &quot;([^&lt;]*)$&quot;), reps(&quot;{&quot;, k, &quot;\\1&quot;), Str2)<br>
&gt;<br>
&gt; pat &lt;-<br>
&gt; &quot;^(}*)([.]*)(&gt;*)([.]*)(&lt;*)([.]*)(&gt;*)([.]*)(&lt;*)([.]*)(&gt;*)([.]*)(&lt;*)([.]*<br>
&gt; )({*)([.]*)$&quot;<br>
&gt; lens &lt;- sapply(strapply(Str3, pat, c)[[1]], nchar)<br>
&gt; tokens &lt;- unlist(read.fwf(textConnection(Seq), lens, <a href="http://as.is" target="_blank">as.is</a> = TRUE))<br>
&gt; closeAllConnections()<br>
&gt; tokens[<a href="http://is.na" target="_blank">is.na</a>(tokens)] &lt;- &quot;&quot;<br>
&gt; out &lt;- relist(tokens, template)<br>
&gt; out<br>
&gt;<br>
&gt;<br>
&gt; Here is the str of the output for your sample input:<br>
&gt;<br>
&gt; &gt; str(out)<br>
&gt; List of 9<br>
&gt;  $ Stem 0 opening      : chr &quot;GCCTCGA&quot;<br>
&gt;  $ before Stem 1       : chr &quot;TA&quot;<br>
&gt;  $ Stem 1              :List of 3<br>
&gt;   ..$ opening: chr &quot;GCTC&quot;<br>
&gt;   ..$ inside : chr &quot;AGTTGGGA&quot;<br>
&gt;   ..$ closing: chr &quot;GAGC&quot;<br>
&gt;  $ between Stem 1 and 2: chr &quot;G&quot;<br>
&gt;  $ Stem 2              :List of 3<br>
&gt;   ..$ opening: chr &quot;TACGA&quot;<br>
&gt;   ..$ inside : chr &quot;CTGAAGA&quot;<br>
&gt;   ..$ closing: chr &quot;TCGTA&quot;<br>
&gt;  $ between Stem 2 and 3: chr &quot;AGGtC&quot;<br>
&gt;  $ Stem 3              :List of 3<br>
&gt;   ..$ opening: chr &quot;ACCAG&quot;<br>
&gt;   ..$ inside : chr &quot;TTCGATC&quot;<br>
&gt;   ..$ closing: chr &quot;CTGGT&quot;<br>
&gt;  $ After Stem 3        : chr &quot;&quot;<br>
&gt;  $ Stem 0 closing      : chr &quot;TCGGGGC&quot;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Mar 16, 2010 at 6:10 AM, Tal Galili &lt;<a href="mailto:tal.galili@gmail.com">tal.galili@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt; &gt; Hello all,<br>
&gt; &gt;<br>
&gt; &gt; For some work I am doing on RNA, I want to use R to do string parsing<br>
&gt; that<br>
&gt; &gt; (I think) is like a simplistic HTML parsing.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; For example, let&#39;s say we have the following two variables:<br>
&gt; &gt;<br>
&gt; &gt;    Seq &lt;-<br>
&gt; &gt;<br>
&gt; &quot;GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGG<br>
&gt; GCA&quot;<br>
&gt; &gt;    Str &lt;-<br>
&gt; &gt;<br>
&gt; &quot;&gt;&gt;&gt;&gt;&gt;&gt;&gt;..&gt;&gt;&gt;&gt;........&lt;&lt;&lt;&lt;.&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;.....&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br>
&gt; &lt;&lt;.&quot;<br>
&gt; &gt;<br>
&gt; &gt; Say that I want to parse &quot;Seq&quot; According to &quot;Str&quot;, by using the<br>
&gt; legend here<br>
&gt; &gt;<br>
&gt; &gt; Seq:<br>
&gt; GCCTCGATAGCTCAGTTGGGAGAGCGTACGACTGAAGATCGTAAGGtCACCAGTTCGATCCTGGTTCGGGG<br>
&gt; CA<br>
&gt; &gt; Str:<br>
&gt; &gt;&gt;&gt;&gt;&gt;&gt;&gt;..&gt;&gt;&gt;&gt;........&lt;&lt;&lt;&lt;.&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;.....&gt;&gt;&gt;&gt;&gt;.......&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br>
&gt; &lt;.<br>
&gt; &gt;<br>
&gt; &gt;     |     |  |              | |               |     |<br>
&gt; ||     |<br>
&gt; &gt;<br>
&gt; &gt;     +-----+  +--------------+ +---------------+     +---------------<br>
&gt; ++-----+<br>
&gt; &gt;<br>
&gt; &gt;        |        Stem 1            Stem 2                 Stem 3<br>
&gt;   |<br>
&gt; &gt;<br>
&gt; &gt;        |<br>
&gt;    |<br>
&gt; &gt;<br>
&gt; &gt;        +-------------------------------------------------------------<br>
&gt; ---+<br>
&gt; &gt;<br>
&gt; &gt;                                Stem 0<br>
&gt; &gt;<br>
&gt; &gt; Assume that we always have 4 stems (0 to 3), but that the length of<br>
&gt; letters<br>
&gt; &gt; before and after each of them can very.<br>
&gt; &gt;<br>
&gt; &gt; The output should be something like the following list structure:<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt;    list(<br>
&gt; &gt;     &quot;Stem 0 opening&quot; = &quot;GCCTCGA&quot;,<br>
&gt; &gt;     &quot;before Stem 1&quot; = &quot;TA&quot;,<br>
&gt; &gt;     &quot;Stem 1&quot; = list(opening = &quot;GCTC&quot;,<br>
&gt; &gt;     inside = &quot;AGTTGGGA&quot;,<br>
&gt; &gt;     closing = &quot;GAGC&quot;<br>
&gt; &gt;     ),<br>
&gt; &gt;     &quot;between Stem 1 and 2&quot; = &quot;G&quot;,<br>
&gt; &gt;     &quot;Stem 2&quot; = list(opening = &quot;TACGA&quot;,<br>
&gt; &gt;     inside = &quot;CTGAAGA&quot;,<br>
&gt; &gt;     closing = &quot;TCGTA&quot;<br>
&gt; &gt;     ),<br>
&gt; &gt;     &quot;between Stem 2 and 3&quot; = &quot;AGGtC&quot;,<br>
&gt; &gt;     &quot;Stem 3&quot; = list(opening = &quot;ACCAG&quot;,<br>
&gt; &gt;     inside = &quot;TTCGATC&quot;,<br>
&gt; &gt;     closing = &quot;CTGGT&quot;<br>
&gt; &gt;     ),<br>
&gt; &gt;     &quot;After Stem 3&quot; = &quot;&quot;,<br>
&gt; &gt;     &quot;Stem 0 closing&quot; = &quot;TCGGGGC&quot;<br>
&gt; &gt;    )<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; I don&#39;t have any experience with programming a parser, and would like<br>
&gt; &gt; advices as to what strategy to use when programming something like<br>
&gt; this (and<br>
&gt; &gt; any recommended R commands to use).<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; What I was thinking of is to first get rid of the &quot;Stem 0&quot;, then go<br>
&gt; through<br>
&gt; &gt; the inner string with a recursive function (let&#39;s call it<br>
&gt; &quot;seperate.stem&quot;)<br>
&gt; &gt; that each time will split the string into:<br>
&gt; &gt; 1. before stem<br>
&gt; &gt; 2. opening stem<br>
&gt; &gt; 3. inside stem<br>
&gt; &gt; 4. closing stem<br>
&gt; &gt; 5. after stem<br>
&gt; &gt;<br>
&gt; &gt; Where the &quot;after stem&quot; will then be recursively entered into the same<br>
&gt; &gt; function (&quot;seperate.stem&quot;)<br>
&gt; &gt;<br>
&gt; &gt; The thing is that I am not sure how to try and do this coding without<br>
&gt; using<br>
&gt; &gt; a loop.<br>
&gt; &gt;<br>
&gt; &gt; Any advices will be most welcomed.<br>
&gt; &gt;<br>
&gt; &gt;<br>
&gt; &gt; ----------------Contact<br>
&gt; &gt; Details:-------------------------------------------------------<br>
&gt; &gt; Contact me: <a href="mailto:Tal.Galili@gmail.com">Tal.Galili@gmail.com</a> |  972-52-7275845<br>
&gt; &gt; Read me: <a href="http://www.talgalili.com" target="_blank">www.talgalili.com</a> (Hebrew) | <a href="http://www.biostatistics.co.il" target="_blank">www.biostatistics.co.il</a><br>
&gt; (Hebrew) |<br>
&gt; &gt; <a href="http://www.r-statistics.com" target="_blank">www.r-statistics.com</a> (English)<br>
&gt; &gt; ---------------------------------------------------------------------<br>
&gt; -------------------------<br>
&gt; &gt;<br>
&gt; &gt;        [[alternative HTML version deleted]]<br>
&gt; &gt;<br>
&gt; &gt; ______________________________________________<br>
&gt; &gt; <a href="mailto:R-help@r-project.org">R-help@r-project.org</a> mailing list<br>
&gt; &gt; <a href="https://stat.ethz.ch/mailman/listinfo/r-help" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help</a><br>
&gt; &gt; PLEASE do read the posting guide <a href="http://www.R-project.org/posting-" target="_blank">http://www.R-project.org/posting-</a><br>
&gt; guide.html<br>
&gt; &gt; and provide commented, minimal, self-contained, reproducible code.<br>
&gt; &gt;<br>
&gt;<br>
&gt; ______________________________________________<br>
&gt; <a href="mailto:R-help@r-project.org">R-help@r-project.org</a> mailing list<br>
&gt; <a href="https://stat.ethz.ch/mailman/listinfo/r-help" target="_blank">https://stat.ethz.ch/mailman/listinfo/r-help</a><br>
&gt; PLEASE do read the posting guide <a href="http://www.R-project.org/posting-" target="_blank">http://www.R-project.org/posting-</a><br>
&gt; guide.html<br>
&gt; and provide commented, minimal, self-contained, reproducible code.<br>
</div></div></blockquote></div><br></div></div></div>