Clear Filters
Clear Filters

Delete rows from a cell array based on key words

1 view (last 30 days)
Hello,
I have currently created a cell array that takes the following form:
'6440.016' 'hold'
'7378.016' 'max-pressure-evac 60.0'
'8372.016' 'max-pressure-evac 60.0'
'9365.016' 'max-pressure-evac 60.0'
'10357.016' 'max-pressure-evac 60.0'
'11338.016' 'max-pressure-evac 60.0'
'12298.016' 'max-pressure-evac 60.0'
'13259.016' 'max-pressure-evac 60.0'
'14221.016' 'max-pressure-evac 60.0'
'15184.016' 'max-pressure-evac 60.0'
'16149.016' 'max-pressure-evac 60.0'
'17115.016' 'max-pressure-evac 60.0'
'18082.016' 'max-pressure-evac 60.0'
'19050.016' 'max-pressure-evac 60.0'
'19424.016' 'hold-end'
'19553.016' 'hold'
'20272.016' 'max-pressure-evac 60.0'
'21109.016' 'max-pressure-evac 60.0'
'21919.016' 'hold-end'
'22048.016' 'hold'
'22651.016' 'max-pressure-evac 60.0'
'23374.016' 'max-pressure-evac 60.0'
'23489.016' 'hold-end'
'23619.016' 'hold'
'24131.016' 'max-pressure-evac 60.0'
'24762.016' 'max-pressure-evac 60.0'
'25060.016' 'hold-end'
'25190.016' 'hold'
'25640.016' 'max-pressure-evac 60.0'
'26212.016' 'max-pressure-evac 60.0'
'26631.016' 'hold-end'
If there are consecutive rows that say 'max-pressure-evac 60.0', I wish to only keep the final 'max-pressure-evac 60.0' and delete the ones above it. To clarify, here I have 5 different occaisons where 'max-pressure-evac 60.0' is repeated. Instead of having 21 'max-pressure-evac 60.0' rows I only want 5 which correspond to the time stamps of 19050, 21109, 23374, 24762, and 26212. I'm unable to wrap my mind around accomplishing this and any help would be greatly appreciated.

Accepted Answer

Voss
Voss on 28 Jan 2022
data = { ...
'6440.016' 'hold'; ...
'7378.016' 'max-pressure-evac 60.0'; ...
'8372.016' 'max-pressure-evac 60.0'; ...
'9365.016' 'max-pressure-evac 60.0'; ...
'10357.016' 'max-pressure-evac 60.0'; ...
'11338.016' 'max-pressure-evac 60.0'; ...
'12298.016' 'max-pressure-evac 60.0'; ...
'13259.016' 'max-pressure-evac 60.0'; ...
'14221.016' 'max-pressure-evac 60.0'; ...
'15184.016' 'max-pressure-evac 60.0'; ...
'16149.016' 'max-pressure-evac 60.0'; ...
'17115.016' 'max-pressure-evac 60.0'; ...
'18082.016' 'max-pressure-evac 60.0'; ...
'19050.016' 'max-pressure-evac 60.0'; ...
'19424.016' 'hold-end'; ...
'19553.016' 'hold'; ...
'20272.016' 'max-pressure-evac 60.0'; ...
'21109.016' 'max-pressure-evac 60.0'; ...
'21919.016' 'hold-end'; ...
'22048.016' 'hold'; ...
'22651.016' 'max-pressure-evac 60.0'; ...
'23374.016' 'max-pressure-evac 60.0'; ...
'23489.016' 'hold-end'; ...
'23619.016' 'hold'; ...
'24131.016' 'max-pressure-evac 60.0'; ...
'24762.016' 'max-pressure-evac 60.0'; ...
'25060.016' 'hold-end'; ...
'25190.016' 'hold'; ...
'25640.016' 'max-pressure-evac 60.0'; ...
'26212.016' 'max-pressure-evac 60.0'; ...
'26631.016' 'hold-end'; ...
};
% gonna calculate the indices of the rows we want to keep.
% first make a vector of indices of all rows:
all_idx = 1:size(data,1);
% then find whether or not each row has 'max-pressure-evac 60.0':
idx = strcmp(data(:,2),'max-pressure-evac 60.0');
% now, keep those rows that do not say 'max-pressure-evac 60.0'
% (all_idx(~idx)), along with those rows that *do* say
% 'max-pressure-evac 60.0', if the next row says something else
% (or if it's the last row of data - there is no next row):
keep_idx = [all_idx(~idx) strfind([idx.' false],[true false])];
% grab those rows of data, in the right order:
new_data = data(sort(keep_idx),:);
disp(new_data);
{'6440.016' } {'hold' } {'19050.016'} {'max-pressure-evac 60.0'} {'19424.016'} {'hold-end' } {'19553.016'} {'hold' } {'21109.016'} {'max-pressure-evac 60.0'} {'21919.016'} {'hold-end' } {'22048.016'} {'hold' } {'23374.016'} {'max-pressure-evac 60.0'} {'23489.016'} {'hold-end' } {'23619.016'} {'hold' } {'24762.016'} {'max-pressure-evac 60.0'} {'25060.016'} {'hold-end' } {'25190.016'} {'hold' } {'26212.016'} {'max-pressure-evac 60.0'} {'26631.016'} {'hold-end' }
Showing the relevant intermediate variables' values so you can get a feel for how this works:
disp(idx.')
0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
disp(strfind([idx.' false],[true false]))
14 18 22 26 30

More Answers (0)

Categories

Find more on Debugging and Analysis 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!