Delete data with some requirements
Show older comments
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
5 Comments
Please use the Code-formatting for the code to improve the readability.
What is the purpose of this line:
Zx(i) && Zy(i) == 0
? Do you mean:
Zx(i) = 0;
Zy(i) = 0;
What is Mean_X and Std_X? What is Zxt?
After you have set
Zx = zeros(size(X));
Zy = zeros(size(Y));
checking the values of Zx and Zy is not meaningful:
if Zxt(i)<2.5 && Zx(i)>-2.5 && Zy(i)<2.5 && Zy(i)>-2.5
You you want to check X and Y instead?
Xscore(rowsToDelete) = []; % Set to null.
The comment is misleading: This does not set the data to "null".
Joel Handy
on 16 Jul 2019
Edited: Joel Handy
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)];
Skydriver
on 16 Jul 2019
Joel Handy
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.
Accepted Answer
More Answers (1)
Skydriver
on 16 Jul 2019
0 votes
4 Comments
Joel Handy
on 16 Jul 2019
The loop is unecessary. I think so is the recomputing Zx and Zy since you are just recomputing the values in the data file?
I also suggest you look into the abs function which returns the absolute value (i.e negative values are made positive values and positive values are left alone).
D = load('Xsample_data.txt');
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)
rowsToKeep = abs(Zx) <= 2.5 & abs(Zy) <= 2.5;
Zx = (X - Mean_X)./Std_X; % I think this line is unecessary
Zx(~rowsToKeep) = 0;
Zy = (Y - Mean_Y)./Std_Y; % I think this line is unecessary
Zy(~rowsToKeep) = 0;
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
Skydriver
on 16 Jul 2019
Joel Handy
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)
I'm using logical indexing in my answer. That is one topic to research for more information.
Joel Handy
on 16 Jul 2019
I'm not away of any private comunication option
Categories
Find more on Database Toolbox 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!