## Moving NaN elements from the last columns to the first column, iteratively

### gd94 (view profile)

on 10 Jun 2019
Latest activity Commented on by TADA

on 11 Jun 2019

Hello community,
I'm struggling to figure out a way to automatize a problem I'm confronting on Matlab. Here is a fictitious matrix that replicates my issue (mine is much bigger, but always has between 0 and 2 NaN observations at the end of the matrix):
A = [1 2 3 4 5 6 7 8 NaN NaN;
1 2 3 4 5 6 7 8 9 NaN;
1 2 3 4 5 6 7 8 9 10]
For those rows that have NaNs, I want to move the NaN observations to the front of the matrix, so as to have this;
A = [NaN NaN 1 2 3 4 5 6 7 8;
NaN 1 2 3 4 5 6 7 8 9;
1 2 3 4 5 6 7 8 9 10]
This is a code which works for me with a row vector (i.e A = [1 2 3 4 5 6 7 8 NaN NaN]):
while isnan(A(end))
A = A(1:end-1);
A = [NaN,A];
end
I can't seem to figure out how to broaden the loop to the general case presented above (the 3x10 matrix).
Thank you!

### Release

R2017b

on 10 Jun 2019

on 11 Jun 2019

The simplest way would be to loop through the rows:
i = isnan(A);
for j = 1:size(A,1)
A(j,:) = [A(j,i(j,:)) A(j,~i(j,:))];
end
Another approach:
a1 = A';
[~, ord] = sort(~isnan(a1));
ord2 = ord + repmat(0:size(a1,1):numel(a1)-1, size(a1,1),1);
a2 = a1(ord2)'

gd94

### gd94 (view profile)

on 11 Jun 2019
Cheers! I'll have a look at this code now and tell you whether it works!
gd94

### gd94 (view profile)

on 11 Jun 2019
Works.... great! Thank you so much TADA

on 11 Jun 2019
cheers no problem

### Bob Nbob (view profile)

on 10 Jun 2019

Do you want your numeric values in ascending order? If so you should be able to do the following:
A = sort(A,2,'MissingPlacement','first');

gd94

### gd94 (view profile)

on 11 Jun 2019
No, not necessarily. The 1 2 3 ..... 9 were just examples of numbers, but they need not be in ascending order. The order should just be maintained when moving the NaNs to the front.