Select subset of data going backwards
    5 views (last 30 days)
  
       Show older comments
    
Hi, I've got a matrix of data and need to start at a specific row within the dataset and, based on a condition, select the previous 5 rows. For example:
if column 6 > 0
a = iterate through and get the value of column 4 that corresponds to column 6 > 0 (i.e. 694)
starting at position a, get the previous 5 rows of data from column 4 where column 3 = 1
iterate through the whole file

In this case I would expect 361, 360, 349, 343, 331 to be returned (yellow).
What I really need to do is get the mean of these numbers but I need to select them first.
I hope I've explained it well. I'm just really stuck on how to go backwards in Matlab.
Thanks
0 Comments
Accepted Answer
  rocketboyjka
      
 on 23 Jun 2016
        
      Edited: rocketboyjka
      
 on 23 Jun 2016
  
      Try this:
 targetIndex = find(myMatrix(:,6) > 0);
 desiredData = myMatrix(targetIndex-5:targetIndex-1,4);
If there is more than one location in your matrix where the condition is met, then targetIndex will be a vector of indices where the condition occurs and you could adapt it like this:
 targetIndex = find(myMatrix(:,6) > 0);
 for ii = 1:length(targetIndex)
     desiredData(:,ii) = myMatrix(targetIndex(ii)-5:targetIndex(ii)-1,4);
 end
Then each column will be the numbers that met your condition.
4 Comments
  rocketboyjka
      
 on 24 Jun 2016
				I missed your part about sorting by column 3. I tested this on your data. Should work if you're still looking.
 targetIndex = find(myMatrix(:,6) > 0);
 for ii = 1:length(targetIndex)
     candiateRows = find(myMatrix(1:targetIndex(ii)-1,3) ~= 0);
     if length(candiateRows) < 5
          startIndex = 1;
          numRows = length(candiateRows);
     else
          startIndex = length(candiateRows)-4;
          numRows = 5;
     end
     desiredData(:,ii) = myMatrix(candiateRows(startIndex:end),4);
 end
More Answers (1)
  Thorsten
      
      
 on 23 Jun 2016
        i1 = find(a(:,6) > 0, 1, 'first')
i2 = find(a(1:i1, 3) == 1, 5, 'last')
res = flipud(a(i2, 4))
See Also
Categories
				Find more on Logical in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!