## Delete data with some requirements

on 16 Jul 2019
Latest activity Commented on by Joel Handy

on 16 Jul 2019

### Star Strider (view profile)

I have a coding like this:
Zx= zeros(size(X));
Zy=zeros(size(Y));
for i=1:length(X);
if Zx(i)<2.5 && Zx(i)>-2.5 && Zy(i)<2.5 && Zy(i)>-2.5
Zx(i) = (X(i) - Mean_X)/Std_X;
Zy(i) = (Y(i) - Mean_Y)/Std_Y;
else
Zx(i) && Zy(i) == 0
end
end
rowsToDelete = (Zx < -2.5 | Zx > 2.5) & (Zy <= -2.5 & Zy >= 2.5);
Xscore(rowsToDelete) = []; % Set to null.
Yscore(rowsToDelete) = []; % Set to null.
OutZscore=[X Y Zx Zy];
I also attach my data, two first coloumn is X and Y and two second column is Zx and Zy. X and Zx is a partner and Y and Zy is partner to in the same row.
I want to delete my X dan Y data with the requirement is X data wil be deleted is the requirement will explain such as (Zx<-2.5 and Zx>2.5) and (Zy<-2.5 and Zy>2.5).
The result is not satified.
I want to plot the data to compare the process before and after deleted.
Is there any one can help me I would be appreciate.
Thx

Joel Handy

### Joel Handy (view profile)

on 16 Jul 2019
its a little hard to tell exactly what you are doing since there seems to be some missing contex with a number of undefined variables. Also, in your description it sounds like your data has 4 columns but the sample data you provided only has three columns.
One problem I see, you set Zx and Zy to zero then check if the absolute value of Zx and Zy are less than 2.5 which will always be true. You will never run your "else" code.
I also think you want rowsToDelete to be abs(Zx) > 2.5 | abs(Zy) > 2.5. so that data gets deleted if Zx exceeds the limit OR Zy exceeds the limit. The way you have it written Zx AND Zy need to exceed the limit,
As a side note, I believe the code you have can be simplified significantly:
Zx = (X - mean(X))./std(X);
Zy = (Y - mean(Y))./std(Y);
rowsToKeep = abs(Zx) <= 2.5 & abs(Zy) <= 2.5;
OutZScore = [X(rowsToKeep) Y(rowsToKeep) Zx(rowsToKeep) Zy(rowsToKeep)];

on 16 Jul 2019
Thank you Joel Handy with your respond. I just put in the file of data input the out put of Zx and Zy. I want to show the result of my calculation so the row number 95th until the end wil be deleted. But I still don't know how to process for deleting. The requirement must be part of the data X and Y will be removed.
Joel Handy

### Joel Handy (view profile)

on 16 Jul 2019
I think maybe you are looking for:
X = X(rowsToKeep);
Y = Y(rowsToKeep);
Zx = Zx(rowsToKeep);
Zy = Zy(rowsToKeep);
Or
X(~rowsToKeep) = [];
Y(~rowsToKeep) = [];
Zx(~rowsToKeep) = [];
Zy(~rowsToKeep) = [];
Not that in the latter example, you arent setting anything to null, you are setting them to "empty", i.e. deleting them.
Also as far as plotting, Star Striders answers should be what you are looking for.

### Star Strider (view profile)

on 16 Jul 2019

Try this:
X = D(:,1);
Y = D(:,2);
Zx = D(:,3);
Zy = D(:,4);
Lvx = (Zx < -2.5) & (Zx > 2.5);
Lvy = (Zy < -2.5) & (Zy > 2.5);
RowsToDelete = Lvx & Lvy;
figure
plot(X, Y)
hold on
plot(Zx, Zy)
hold off
grid
figure
plot(X(~RowsToDelete), Y(~RowsToDelete))
hold on
plot(Zx(~RowsToDelete), Zy(~RowsToDelete))
hold off
grid

on 16 Jul 2019
Dear Star Rider
I just want plot the data of X and Y and also the data X(after delete) and Y (after delete). I will delete both X, Y and Zx and Zy when fullfill the requirement in the same row offcourse. My point is actually to delete the data X and Y when Zx for X is beloow -2.5 and upper 2.5 as well Zy is bellow -2.5 and upper 2.5. Maybe I have mistake to define the null.
Star Strider

### Star Strider (view profile)

on 16 Jul 2019
Try this:
Lvx = (Zx < -2.5) | (Zx > 2.5);
Lvy = (Zy < -2.5) | (Zy > 2.5);
RowsToDelete = Lvx & Lvy;
figure
plot(X, Y, '-pb')
hold on
plot(X(~RowsToDelete), Y(~RowsToDelete), '-pr')
hold off
grid
Experiment with the plot to get the result you want.
Star Strider

### Star Strider (view profile)

on 16 Jul 2019
How about the value of Zx and Zy is above 3 maybe in other case. It should be also deleted.
Set the upper limit to 3:
Lvx = (Zx < -2.5) | (Zx > 2.5);
Lvy = (Zy < -2.5) | (Zy > 2.5);
That will change the upper limit, so that only values >3 (and <-2.5) will be deleted. All values >3 will already be deleted with the current threshold of >2.5.

on 16 Jul 2019

Dear Star Rider and Joel Handy.
I tried to combine your suggestion and the coding is like this:
X = D(:,1);
Y = D(:,2);
Zx = D(:,3);
Zy = D(:,4);
Mean_X = mean(X)
Std_X = std(X)
Mean_Y = mean(Y)
Std_Y = std(Y)
Zx= zeros(size(X));
Zy=zeros(size(Y));
for i=1:length(X);
if Zx(i)<2.5 && Zx(i)>-2.5 && Zy(i)<2.5 && Zy(i)>-2.5
Zx(i) = (X(i) - Mean_X)/Std_X;
Zy(i) = (Y(i) - Mean_Y)/Std_Y;
else
Zx(i) && Zy(i) == 0
end
end
rowsToKeep = abs(Zx > -2.5 | Zx < 2.5) & (Zy > -2.5 & Zy < 2.5);
OutZScore = [X(rowsToKeep) Y(rowsToKeep) Zx(rowsToKeep) Zy(rowsToKeep)];
X1=X(rowsToKeep);
Y1=Y(rowsToKeep);
figure
plot(X, Y,'b.')
hold on
plot(X1,Y1,'r.')
hold off
grid
If your any comment for my coding?

Show 1 older comment

on 16 Jul 2019
rowsToKeep = abs(Zx) <= 2.5 & abs(Zy) <= 2.5;
How about the value of Zx and Zy is above 3 maybe in other case. It should be also deleted.
Joel Handy

### Joel Handy (view profile)

on 16 Jul 2019
There is a bit of a language barrier so I'm not entirely sure what your question is. The statement you have highlighted will be true when -2.5 <= Zx <=2.5 AND -2.5 <= Zy <=2.5 and rowsToKeep with be the same size as Zx and Zy. You can craft a similar logical statement with whatever conditions you would like. If you would rather the upper limit be 3, the statment woul look like this:
rowsToKeep = (Zx >= -2.5 & Zx <= 3) & (Zy >= -2.5 & Zy <= 3)