Replacing NaN with the average of previous and next cell value
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
krai
el 7 de Jun. de 2018
Comentada: Jan
el 8 de Jun. de 2018
I have a data set like,
time 1 2 3 4 5 6 7 8
exp1 45 67 78 NaN 80 81 82 83
These are two separate column with time and exp1 as header. how do I replace the NaN with the average of previous cell value and the next. Like in the above example, NaN should be replaced by 79 ((78+80)/2 )
Thanks in advance
3 comentarios
Jan
el 7 de Jun. de 2018
Please post the input data in valid Matlab syntax. A "data set" might be a variety of things.
Respuesta aceptada
Razvan Carbunescu
el 7 de Jun. de 2018
>> exp1 = [45 67 78 NaN 80 81 82 83];
>> fillmissing(exp1,'linear')
ans =
45 67 78 79 80 81 82 83
2 comentarios
Más respuestas (2)
Jan
el 7 de Jun. de 2018
Editada: Jan
el 7 de Jun. de 2018
Maybe:
y = fillgaps(exp1, 3, 1)
% Needs Matlab >= R2016a
[EDITED] Sorry, this does not do, what I expect.
According to the documentation I'd expect a linear fit to the neighboring
elements.
Or:
valid = ~isnan(exp1);
y = exp1;
y(~valid) = interp1(time(valid), exp1(valid), time(~valid))
This is a linear interpolation.
0 comentarios
Paolo
el 7 de Jun. de 2018
Editada: Paolo
el 7 de Jun. de 2018
If you are working with a table:
%Table.
var = {'time';'exp1'};
time = [1;2;3;4;5;6;7;8];
exp1 = [45;67;78;NaN;80;81;82;83];
t = table(time,exp1);
x = t.exp1;
nan = isnan(x);
indx = find(nan);
x(nan) = (x(indx-1)+x(indx+1))/2;
t.exp1 = x;
If you are working with a cell array:
%Cell array.
var = {'time',1,2,3,4,5,6,7,8;'exp1',45,67,78,NaN,80,81,82,83};
x = cell2mat(var(2,2:end));
nan = isnan(x);
indx = find(nan);
x(nan) = (x(indx-1)+x(indx+1))/2;
var(2,2:end) = num2cell(x);
0 comentarios
Ver también
Categorías
Más información sobre NaNs en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!