Replace NaN's in table with zero
    99 次查看(过去 30 天)
  
       显示 更早的评论
    
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.
3 个评论
采纳的回答
  Peter Perkins
    
 2015-7-26
        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.
1 个评论
  Chris Hooper
 2024-8-23
				NaN does not work as desired in unique function:
An option in the unique fuction to treat NaN as a distinct would negate one reason for replacing NaN.
更多回答(9 个)
  Akira Agata
    
      
 2017-2-17
        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;
  Yuting Mou
      
 2016-7-29
        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
  Steven Lord
    
      
 2018-7-23
        I would use the fillmissing function introduced in release R2016b. See the "Table with Multiple Data Types" example on that documentation page for a demonstration of how to replace NaN values with 0.
  J.M. Verduijn
      
 2019-2-8
        for i= 1: width(T)
    T.(i)(isnan(T.(i))) = 0;
end    
Works for me, replaces all NaN values in table T with 0
  Zachary Smith
 2020-3-19
        If you are using readtable() to load the table from a file, then you can add the name-value pair argument 'EmptyValue',0 to do this automatically.
0 个评论
  Aron Magesh
      
 2021-3-7
        
      编辑:Aron Magesh
      
 2021-3-7
  
      Just use fillmissing function if the data is in a table or timetable.
1 个评论
  Walter Roberson
      
      
 2021-3-7
				That is what Steven Lord suggested in https://www.mathworks.com/matlabcentral/answers/231096-replace-nan-s-in-table-with-zero#answer_329967 
  carolina franco
      
 2020-1-28
        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
2 个评论
  Stephen23
      
      
 2020-1-28
				Note that all the original question explicitly states that "..I am using a table, not a matrix", and all of the other answers work with tables, not numeric matrices. Tables are a container array type:
  Gabor
      
 2021-3-11
        T{:,2:4}(ismissing(T{:,2:4})) = 0;
2:4 are the columns which are containing NaN values.
1 个评论
  Walter Roberson
      
      
 2021-3-11
				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
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



















