Replacing NaN values with average values of the nearest numbers?

Hi, I have a data set with blocks of NaN Values. Is there a command that can fill in missing values by using the average of the values on either side?
For example, in the data set:
2
3
5
7
NaN
NaN
12
Is there a way to get something like 8.66 and 10.33 for the NaN numbers?
Also, would this work if there were multiple columns?
Thanks, Isaac

1 Comment

For newer versions, fillmissing (Introduced in R2016b) is a robust option -
nandata=[2;3;5;7;nan;nan;12];
fillmissing(nandata, 'linear')
ans = 7×1
2.0000 3.0000 5.0000 7.0000 8.6667 10.3333 12.0000

Sign in to comment.

Answers (2)

Hi Isaac,
you can use interp1:
nandata=[2;3;5;7;nan;nan;12];
xdata=(1:length(data))';
data=interp1(xdata(~isnan(nandata)),nandata(~isnan(nandata)),xdata)
data =
2.0000
3.0000
5.0000
7.0000
8.6667
10.3333
12.0000
For multiple columns, you'll need bsxfun:
nandata2=[2 1;3 nan;5 2;7 nan;nan nan;nan 1;12 10];
xdata2=(1:size(nandata,1))';
data2=bsxfun(@(x,y) interp1(y(~isnan(x)),x(~isnan(x)),y),nandata2,xdata2)
data2 =
2.0000 1.0000
3.0000 1.5000
5.0000 2.0000
7.0000 1.6667
8.6667 1.3333
10.3333 1.0000
12.0000 10.0000

1 Comment

Finally I found somthing that worked for what I needed. Thanks for the great answer!

Sign in to comment.

With repnan,
nandata=[2;3;5;7;nan;nan;12];
data = repnan(nandata)
2.0000
3.0000
5.0000
7.0000
8.6667
10.3333
12.0000

1 Comment

hmmm.... only seems to work when there are bounded values, like that last 12 at the end there. But good suggestion!

Sign in to comment.

Tags

Asked:

on 29 Oct 2014

Commented:

on 13 Dec 2023

Community Treasure Hunt

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

Start Hunting!