Replacing NaN with the average of previous and next cell value
6 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaires
Jan
le 7 Juin 2018
Please post the input data in valid Matlab syntax. A "data set" might be a variety of things.
Réponse acceptée
Razvan Carbunescu
le 7 Juin 2018
>> exp1 = [45 67 78 NaN 80 81 82 83];
>> fillmissing(exp1,'linear')
ans =
45 67 78 79 80 81 82 83
2 commentaires
Plus de réponses (2)
Jan
le 7 Juin 2018
Modifié(e) : Jan
le 7 Juin 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 commentaires
Paolo
le 7 Juin 2018
Modifié(e) : Paolo
le 7 Juin 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 commentaires
Voir également
Catégories
En savoir plus sur Tables dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!