Conditionally select rows and add to new table
5 views (last 30 days)
Show older comments
Jonathan Cheong
on 25 Nov 2020
Answered: Mathieu NOE
on 30 Nov 2020
For example, I have a 2000 x 3 table: Column_1: Datetime Column_2: Rain Column_3: Soil Moisture
The actual table has more variables but I plan to get to it once I know how to undergo the coding.
The idea is to append the rows to a new table if they meet these conditions:
1) While rain > 3 and ends when rain < 2 for 2 subsequent days
2) The 1st condition cannot be less than 4 days
I've been trying to code this out but have gone nowhere:
for i = 1:height(ddtable)
ii = 0;
finaldd(:,:) = [];
while ddtable.RAIN > 3
ii = ii + 1;
if ii < 4
break
elseif ii > 4
finaldd(ddtable);
end
end
end
Accepted Answer
Mathieu NOE
on 30 Nov 2020
hello
so official answer below (modified original code)
good luck for the future !
load('ddtable2.mat'); % ddtable2
date_ymd = ddtable2.DT;
date_days = datenum(date_ymd);
rain = ddtable2.RAIN;
SM = ddtable2.SM_12h;
samples = length(rain);
% first loop
k = 0;
q = 0;
% let's analyse the data by buffer data slection and analysis
for ci = 1:length(rain)-3
% cond1 : % 4 days and all with rain > 3
buffer1 = rain(ci:ci+3); % 4 days buffer
cond1 = all(buffer1>3); % will be 1 if buffer is contiguous and all values are > 3
if cond1 == 1
k = k+1;
ind_start1(k) = ci;
ind_stop1(k) = ci+3;
end
% cond2 : % 2 days contiguous with rain < 2
buffer2 = rain(ci:ci+1); % 2 days buffer
cond2 = all(buffer2<2); % contiguous and all < 2
if cond2 == 1
q = q+1;
ind_start2(q) = ci;
ind_stop2(q) = ci+1;
end
end
% now let's check when we have a ind_start2 just after one value of
m = 0;
for ck = 1:length(ind_start1)
ind = find(ind_start2>ind_start1(ck));
if ~isempty(ind)
m = m+1;
ind_start22(m) = ind_start2(ind(1));
ind_start11(m) = ind_start1(ck);
end
end
% keep only unique values
[c2,ia2,ic2] = unique(ind_start22);
ind_start222 = ind_start22(ia2);
ind_start111 = ind_start11(ia2);
% finally , stack (concatenate) data that fullfills the condition
time_index = [];
data_rain = [];
for cc = 1:length(ia2)
time_index = [time_index (ind_start111(cc):ind_start222(cc))]; % concatenation
data_rain = [data_rain; rain(ind_start111(cc):ind_start222(cc))]; % concatenation
end
figure(1),plot((1:samples),rain,'b',time_index,data_rain,'-*r');
legend('all data','selected data');
0 Comments
More Answers (0)
See Also
Categories
Find more on Variables 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!