695 views (last 30 days)

Show older comments

Hello, I have a 1501x7 table called 'x' and there appears to be NaN's in the fourth and sixth column called "Age" and "height". I would like a way to replace NaN's with zeros. Take note, that I have already tried:

k = find(isnan(x))';

x(k) = 0;

% and

x(isnan(x)) = 0;

Yet, neither work because I am using a table, not a matrix. I have also tried converting my table into a cell array, and using these same functions, but they still do not work. They return:"Undefined function 'isnan' for input arguments of type 'cell'" ALSO, please note that the table has columns full of text. So, cell2mat does not work.

Peter Perkins
on 26 Jul 2015

There's a function called standardizeMissing that would replace a non-NaN value with NaN, but normally, replacing NaN with a constant value (as opposed to, for example, some sort estimated value) would be kind of a funny thing to do. I'll assume you have a good reason.

Either of the following should work:

>> t = table({'smith';'jones';'doe'},[20;NaN;40],[NaN;72;66],[120;130;140],'VariableNames',{'Name' 'Age' 'Height' 'Weight'})

t =

Name Age Height Weight

_______ ___ ______ ______

'smith' 20 NaN 120

'jones' NaN 72 130

'doe' 40 66 140

>> vars = {'Age' 'Height'};

>> t2 = t{:,vars};

>> t2(isnan(t2)) = 0;

>> t{:,vars} = t2

t =

Name Age Height Weight

_______ ___ ______ ______

'smith' 20 0 120

'jones' 0 72 130

'doe' 40 66 140

>> t = table({'smith';'jones';'doe'},[20;NaN;40],[NaN;72;66],[120;130;140],'VariableNames',{'Name' 'Age' 'Height' 'Weight'});

>> [~,vars] = ismember({'Age' 'Height'},t.Properties.VariableNames)

vars =

2 3

>> for i=vars, t.(i)(isnan(t.(i))) = 0; end

Hope this helps.

Yuting Mou
on 29 Jul 2016

I also run across the problem, but there seems to be an easier way:

x.age(isnan(x.age)) = 0;

This is OK in my case

Akira Agata
on 17 Feb 2017

For example:

% Make a sample table 'T' and replace 'NaN' with 0

T = table({'smith';'jones';'doe'},[20;NaN;40],[NaN;72;66],[120;130;140],'VariableNames',{'Name' 'Age' 'Height' 'Weight'});

idx = ismissing(T(:,{'Age','Height'}));

T{:,{'Age','Height'}}(idx) = 0;

Steven Lord
on 23 Jul 2018

J.M. Verduijn
on 8 Feb 2019

for i= 1: width(T)

T.(i)(isnan(T.(i))) = 0;

end

Works for me, replaces all NaN values in table T with 0

carolina franco
on 28 Jan 2020

Hi,

Another simple way to understand what's going on .

For me, it works well in R2014a. You only need to enter the matrix with NaN values without specifying the columns where NaN values are.

%Input

m_data=C{1,1}; % Matrix with NaN values

%Code

s1=size(m_data,1);

for i= 1: s1

msubs=m_data(i,1:end); % Save existing data in ith row of m_data

msubs=msubs(isnan(m_data(i,1:end))==0); %Substitute matrix/ taking only non-NaN values

m_data(i,1:end)=0; %Erase all existing values in ith row of m_data

m_data(i,1:size(msubs,2))=msubs; %Substitute values without NaN

end

Zachary Smith
on 19 Mar 2020

Aron Magesh
on 7 Mar 2021

Edited: Aron Magesh
on 7 Mar 2021

Just use fillmissing function if the data is in a table or timetable.

Walter Roberson
on 7 Mar 2021

Gabor
on 11 Mar 2021

T{:,2:4}(ismissing(T{:,2:4})) = 0;

2:4 are the columns which are containing NaN values.

Walter Roberson
on 11 Mar 2021

Interesting, that does work.

T = table({'smith';'jones';'doe'},[20;NaN;40],[NaN;72;66],[120;130;140],'VariableNames',{'Name' 'Age' 'Height' 'Weight'})

T{:,2:4}(ismissing(T{:,2:4})) = 0

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!