how to split data with 'or' condition ?
5 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
pruth
el 26 de Nov. de 2019
Comentada: pruth
el 26 de Nov. de 2019
I find this problem bit ticky. not sure how to explain. i hope you'll undersatnd.
I have created this file tempdata_O4_month.mat (attached )
in this file the fourth column is angles.
so in fourth column there is set of repeatating angles(scan) which are 1 ,2,3,5,10,20,40,90 and sometimes it starts from 0. i.e. 0, 0.5, 1, 2, 3, 5, 10,20, 40,90
here i dont need 90 degree row, but i need other.
i want to write a code which will split all the rows asscociated with these set of angles and make a cell.
earlier i was uusing this code
idx = cumsum(all(tempdata_o4(:,4)==90,2)); % to split rows at 90 degree
fun = @(r){tempdata_o4(r(2:end),:)};
QDOAS = accumaracy(idx,rows(:),[],fun);
QDOAS = QDOAS(~cellfun('isempty',QDOAS));
i thought it gives exactly i wanted but i realized that the 90 degree is not always avaialble after each set of scans to split the rows, which creates a cell with two sets of angles. this is not what i want.
i want to use this condition then, ''whenever the code finds the set of only these angles in forth coulmn i.e (1,2,3,5,10,20,40 or 0, 0.5, 1, 2, 3, 5,10,20,40) make it a cell out of it just like i did in above code.'' also i need to use one more condition ''Some times the angles are like 1,2,1,2,3,5,10,20,40 or may be any angle is missing i.e. 1,2,10,20,40 so here just skip this set and go to next set , no need to consider it ''
this problem is killing me since last night. hope anybody of you can help me !
0 comentarios
Respuesta aceptada
Andrei Bobrov
el 26 de Nov. de 2019
Editada: Andrei Bobrov
el 26 de Nov. de 2019
EDIT
lo = [diff(tempdata_o4(:,4)) > 0;false];
i = cumsum(diff([false;lo]) == 1).*lo;
C = accumarray(i + 1,(1:numel(i))',[],@(x){sortrows(tempdata_o4(x,:),4)});
p = {[1;2;3;5;10;20;40];[0;.5;1;2;3;5;10;20;40]};
j = cellfun(@(x)(size(x,1)==7 && all(ismember(p{1},x(:,4)))) ||...
(size(x,1)==9 && all(ismember(p{2},x(:,4)))),C) ;
C_out = C(j);
2 comentarios
Más respuestas (1)
Guillaume
el 26 de Nov. de 2019
Editada: Guillaume
el 26 de Nov. de 2019
My recommendation would be not to split your data into cell arrays. You're complicating your life for no reason.
First, you should convert your matrix into a table, or possibly a timetable since it looks like your first column is date. So:
tempdata = array2table(tempdata_04, 'VariableNames', {'Date', 'xxx', 'yyy', 'Angle', 'zzz', 'ttt'}); %no idea what some columns represent use appropriate names
tempdata.Date = datetime(tempdata.Date, 'ConvertFrom', 'datenum');
Already your data is easier to visualise and more importantly easier to work with. You now have access to functions such as groupsummary which allows you to apply the same calculation to different groups (e.g. each mean of the all the variable per day, or month, or max of the 5th column for each angle, etc.) in just one line of code or groupfilter which allows you to remove some date from the table according to some criteria, again in just one line of code.
It's unclear what you're actually doing with your data, but splitting it into several variables is probably not the correct approach.
Ver también
Categorías
Más información sobre Variables en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!