Replace NaN with mean of previous values

16 views (last 30 days)
Tomás Nunes on 10 May 2018
Edited: Jan on 12 May 2018
Hello, I have a vector that contains some Nan's. How can I replace them with a mean of the previous 5 values? This is what I have tried until now:
for i = 254:1:size(vector)
vector(isnan(vector(i))) = mean(vector(i-5:i-1));
end
and
for i = 254:1:size(vector)
if vector(i) == NaN
vector(i) = mean(vector(i-5:i-1));
end
end
Thank you!
Jan on 12 May 2018
If the 2nd one is wanted, Ameer Hamza's answer does not, what you want.

Ameer Hamza on 10 May 2018
Edited: Ameer Hamza on 10 May 2018
You can avoid for loop altogether
ind = find(isnan(vector));
vector(ind) = arrayfun(@(x) nanmean(vector(x-5:x-1)), ind);
a vectorized code is usually faster and at worst equivalent to loops. Also using arrayfun() makes your code more readable.
Ameer Hamza on 11 May 2018
Why do you need to set nan to 100000. You can directly replace them as I showed in my answer. Does your vector contain more the 5 consecutive nan, in that case, this method will not work. Also, an @Jan pointed out in the comment, if more then one nan occur closely (less than 5 elements apart) my answer do average using first example in Jan's comment.

Steven Lord on 10 May 2018
Use the fillmissing function, specifically the F = fillmissing(A,movmethod,window) syntax. You're going to want to specify a two-element vector [b f] as the window input as described in the documentation for that input argument.

Fangjun Jiang on 10 May 2018
Use the second code, replace size() with numel()

Jan on 11 May 2018
Edited: Jan on 12 May 2018
You forgot to mention, which problem you have with the shown code.
1. size(vector) replies a vector. If vector is a row vector, the output is e.g. [1, 1000]. When this is used in
for i = 254:1:size(vector)
only the first element is used. So this is equivalent to:
for i = 254:1:1
2. A comparison with NaN is FALSE in every case by definition. See:
NaN == NaN
Therefore
if vector(i) == NaN
if isnan(vector(i))
A working version:
for k = 254:numel(vector)
if isnan(vector(k))
vector(k) = mean(vector(k-5:k-1));
end
end
Or
for k = find(isnan(vector))
vector(k) = mean(vector(k-5:k-1));
end