# Error using 'omitnan'

56 views (last 30 days)
Commented: Adam Danz on 10 Jun 2019
Hi MATLAB community,
I wrote a code for identify 999999 to substitute to NaN, my purpose is replace NaN to mean of column data,
[l,c]=size(matrix) % size (324,25)
for w=1:c
for q = 1:l
if matrix(q,w)==999999
matrix(q,w) =NaN;
matrix(isnan(matrix))= mean(matrix(:,w),'omitnan'); % in the case NaN is present in column 21, it will substitute the element for mean of all element in column 21
end
end
end
Could help me?
Grateful

#### 1 Comment

Walter Roberson on 5 Jun 2019
Omitnan did not exist in your release. One of the toolboxes had nanmean()

Adam Danz on 5 Jun 2019
Edited: Adam Danz on 10 Jun 2019
Check out nanmean() in the stats & machine learning toolbox.
An alternative that doesn't require any toolboxes:
nanidx = isnan(matrix(:,w));
mean(matrix(~nanidx,w)
To compute the mean of each column of a matrix while ignoring a key value (999999),
% Create fake data
key = 999999;
matrix = magic(10);
matrix(randi(100,1,10)) = key;
% Identify the columns that contain at least one 999999
isKey = matrix == key;
colIdx = any(isKey,1);
% Count the number of rows per column that are not 999999
rowCount = sum(~isKey);
% Temporarily replace 999999 with 0 and calculate the column means
matrixTemp = matrix .* ~isKey;
colMean = sum(matrixTemp)./rowCount;
% The 2nd block above can be reduced to
% isKey = matrix == key;
% colMean = sum(matrix .* ~isKey)./ sum(~isKey);

Adam Danz on 10 Jun 2019
Happy to help.
[rowIdx,colIdx] = find(matrixTemp==0);
matrixTemp(sub2ind(size(matrixTemp),rowIdx,colIdx)) = colMean(colIdx);
Guilherme Lopes de Campos on 10 Jun 2019
I don't have words to show my thanks,
I am very grateful,
Guilherme
Adam Danz on 10 Jun 2019
I've been there; glad I could help!

R2012a

### Community Treasure Hunt

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

Start Hunting!