필터 지우기
필터 지우기

Delete rows from a cell array based on key words

조회 수: 1 (최근 30일)
Justin Rosenthal
Justin Rosenthal 2022년 1월 28일
댓글: Justin Rosenthal 2022년 1월 28일
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.

채택된 답변

Voss
Voss 2022년 1월 28일
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
  댓글 수: 1
Justin Rosenthal
Justin Rosenthal 2022년 1월 28일
Thank you so much for your help this works perfectly!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Debugging and Analysis에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by