Trying to eliminate a loop
- To: mathgroup at smc.vnet.net
- Subject: [mg50595] Trying to eliminate a loop
- From: János <janos.lobb at yale.edu>
- Date: Sat, 11 Sep 2004 06:45:09 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi,
I have a four letter alphabet:
In[3]:=
baseAlphabet={a,t,c,g}
I can create an arbitrary length list from it with:
generateRandomStrand[alphabet_List, len_Integer] := \
Table[alphabet[[Random[Integer, {1, Length[alphabet]}] ]], {len}];
for example:
ls = generateRandomStrand[baseAlphabet, 23460];
I want to know what kind of primerLength=7 sub-strands are in it, so I
partition it:
lspr = Partition[ls, primerLength, 1];
All the possible sub-strands form a set:
primerSet=Distribute[Table[baseAlphabet, {primerLength}], List];
<< Statistics`DataManipulation`
freq=Frequencies[lspr];
gives me a frequency distribution, that is what elements of primerSet
occur at what frequency in lspr:
To know which sublist occurs the most I do:
In[64]:=
pr=Flatten[First[Extract[freq[[All, 2]], Split[Position[freq,
Max[freq[[All,
1]]]][[All, 1]] ]] ]]
Out[64]=
{a,a,c,t,g,c,g}
and it is at positions
In[65]:=
prpos=Position[lspr,pr]
Out[65]=
{{2860},{4336},{6791},{11387},{12164},{17472},{17833},{17954}}
in lspr and in ls.
At those positions in ls I want to attach the complement of this pr
sublist, so I create the following rules:
complementRule = {a -> t, c -> g, t -> a, g -> c};
replaceWithComplement = {a -> {a, t}, c -> {c, g}, t -> {t, a}, g ->
{g, c}}
I created a For loop which at prpos replaces the elements there with
the double elements indicated by the rule above on primerLength
intervals of ls:
For[i = 1, i ² Length[pr], i++, ls = ReplacePart[ls,
replaceWithComplement, prpos + i - 1, \
Flatten[Position[replaceWithComplement, {Part[Extract[ls,
prpos + i - 1], 1], Part[Extract[
ls, prpos + i - 1], 1] /. complementRule}]]] ]
Mathematica does this For loop in about 0.046678 Second on my machine.
With primerLength=9 it is 0.050748 Second - pr had just three positions
on the strand.
I have the feeling that it can be done faster with Map or MapAt, so the
For loop could go away. I also do not like that I have to rewrite ls
in every cycle. ReplacePart does not look good to me in this
situation, but I have not find yet the way to apply the
replaceWithComplement rule directly to the primerLength long intervals
of ls at prpos positions.
Any good tip ?
Thanks ahead,
J?nos
----------------------------------------------
Trying to argue with a politician is like lifting up the head of a
corpse.
(S. Lem: His Master Voice)
- Follow-Ups:
- Re: Trying to eliminate a loop
- From: DrBob <drbob@bigfoot.com>
- Re: Trying to eliminate a loop
- From: DrBob <drbob@bigfoot.com>
- Re: Trying to eliminate a loop