0
$\begingroup$

I have a 3 dimensional list of data pairs in the form:

{{{{x11,y11},{x12,y12}},{x1...,y1...}},{{x21,y21},{x22,y22}},{x2...,y2...}}... etc

Incidentally the data originates from a Gas Chromatograph, and is ordered by: [[Channel (1-4), Experiment Number (1 - some number), Peak Number (1 - some number)]], and the pairs represent {Retentiom time, Peak area}.

I want to use the replace function to search the data under the condition that the retention time falls within some range, when this condition is satisfied for the pair: {x_,y_}, x is replaced by the name of the gas that elutes e.g. CH4, C2H4 etc., and y is replaced by the peak area multiplied by a response factor.

The retention time window condition is defined for each channel and for each species. Therefore, I made a list of species and channels containing the time windows, the species name and response factor: e.g.

species={CH4,C2H4,etc...}
CH4={CH4ch1,CH4ch2,CH4ch3,CH4ch4}
CH4ch1={{retentiontimeMin,retentiontimeMax},{"speciesname",responsefactor}}

The code that I am using is as follows:

Table[gcData[[channel, All, All]] /. {x_, y_} /; 
 species[[l, channel, 1, 1]] < x < 
  species[[l, channel, 1, 2]] -> {species[[l, channel, 2, 2]], 
 y*species[[l, channel, 2, 1]]}, {channel, 1, 4}, {l, 1, 7}] 

Where gcData is the list of data, and l is the species number.

My problem is that when I use replace I get my original list of data, duplicated 7 times (the number of species I am searching for), where in each iteration the species I am searching for is correctly identified and replace, but on the subsequent iteration I do not see the originally replaced species.

A sample section from the resultant data is shown below:

{{{{"CH4", 34423708},
   {1.581, 240631},
   {1.741, 63594},
   {2.192, 5568}}}
 {{{1.406, 34423708},
   {"C2H6", 0.292896},
   {1.741, 63594},
   {2.192, 5568},}}},
 {{{1.406, 34423708},
   {1.581, 240631},
   {"C2H4", 0.0772031},
   {2.192, 5568},}}}}

How do I stop it duplicating the list?

$\endgroup$
2
  • 1
    $\begingroup$ this is because you are clearly not storing the results of the replacements. I would recommend you to use Do to iterate and store the results after the replacement. ReplaceAll will not modify the original list and thus the need to be stored. $\endgroup$
    – Ali Hashmi
    Commented May 14, 2017 at 14:39
  • $\begingroup$ Thank you for your response Michael E2! I had never used the Fold function, or the Slot function very effectively before. The code you suggested didn't do quite what I wanted, but with some manipulation I got there. $\endgroup$
    – Butters
    Commented May 14, 2017 at 18:52

1 Answer 1

2
$\begingroup$

Maybe this use of Fold?

Table[
 Fold[
  # /. {x_, y_} /; #2[[channel, 1, 1]] < 
       x < #2[[channel, 1, 2]] :> {#[[channel, 2, 2]], 
      y*#[[channel, 2, 1]]} &,
  gcData[[channel, All, All]],
  species],
 {channel, 1, 4}]

See Applying Functions Repeatedly for discussion of FoldList and Fold.

$\endgroup$
1
  • $\begingroup$ +1 ! i was thinking of Fold too but since i did not have a thorough understanding of the question so did not propose. With your answer i have a better understanding now. $\endgroup$
    – Ali Hashmi
    Commented May 14, 2017 at 15:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.