Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

fillmissing

填充缺失条目

说明

F = fillmissing(A,'constant',v) 使用常量值 v 填充缺失的数组或表条目。如果 A 是矩阵或多维数组,则 v 可以是标量或向量。如果 v 是向量,则每个元素指定 A 的对应列中的填充值。如果 A 是表或时间表,则 v 也可以是元胞数组,其元素包含每个表变量的填充值。

缺失值的定义取决于 A 的数据类型:

  • NaN - doublesingledurationcalendarDuration

  • NaTdatetime

  • <missing>string

  • <undefined>categorical

  • {''} - 字符向量的 cell

如果 A 是表,则每个变量的数据类型定义该变量的缺失值。

您可以通过将清洗缺失数据任务添加到实时脚本中,以交互方式使用 fillmissing 功能。

示例

F = fillmissing(A,method) 使用 method 指定的方法填充缺失的条目。例如,fillmissing(A,'previous')A 中的缺失条目使用上一个非缺失条目进行填充。

示例

F = fillmissing(A,movmethod,window) 使用窗长度为 window 的移动窗均值或中位数填充缺失条目。例如,fillmissing(A,'movmean',5) 使用窗长度为 5 的移动均值填充缺失数据。

示例

F = fillmissing(A,'knn') 用最近邻行中的对应值填充缺失条目,这些值是根据行之间的成对欧几里德距离计算的。

示例

F = fillmissing(A,'knn',k)k 最近邻行中对应值的均值填充缺失条目,该均值是根据行之间的成对欧几里德距离计算的。例如,fillmissing(A,'knn',5) 用五个最近邻行中对应值的均值填充 A 中的缺失条目。

F = fillmissing(A,fillfun,gapwindow) 使用由函数句柄 fillfun 指定的自定义方法填充缺失条目的空缺,并在每个空缺周围设置固定窗,从该窗计算填充值。fillfun 必须具有输入参量 xststq,它们是向量,分别包含长度为 gapwindow 的采样数据 xs、长度为 gapwindow 的采样数据位置 ts 和缺失数据位置 tqtstq 中的位置是采样点向量的子集。

示例

F = fillmissing(___,dim) 支持上述语法中的任何输入参量组合,且可指定 A 中要进行运算的维度。默认情况下,fillmissing 沿其大小不为 1 的第一个维度进行运算。例如,如果 A 是矩阵,则 fillmissing(A,2)A 的各列进行运算,逐行填充缺失的数据。

示例

F = fillmissing(___,Name,Value) 使用一个或多个名称-值参量指定用于填充缺失值的其他参数。例如,如果 t 是时间值向量,则 fillmissing(A,'linear','SamplePoints',t) 会基于 t 中的时间值对 A 中的数据进行插值。

示例

[F,TF] = fillmissing(___) 还返回逻辑数组 TF,该数组指示 F 中先前缺失现已填充的条目的位置。

示例

示例

全部折叠

创建包含 NaN 值的向量,并使用前一个非缺失值替换每个 NaN

A = [1 3 NaN 4 NaN NaN 5];
F = fillmissing(A,'previous')
F = 1×7

     1     3     3     4     4     4     5

创建一个 2×2 矩阵,每列有一个 NaN 值。在第一列中用 100 填充 NaN,在第二列中用 1000 填充。

A = [1 NaN; NaN 2]
A = 2×2

     1   NaN
   NaN     2

F = fillmissing(A,'constant',[100 1000])
F = 2×2

           1        1000
         100           2

使用插值来替换非均匀采样的数据中的 NaN 值。

定义非均匀采样点向量,并计算这些点上的正弦函数。

x = [-4*pi:0.1:0, 0.1:0.2:4*pi];
A = sin(x);

NaN 值插入 A 中。

A(A < 0.75 & A > 0.5) = NaN;

使用线性插值填充缺失数据,并返回填充的向量 F 和逻辑向量 TFTF 项中的值 1 (true) 对应于 F 中的填充值。

[F,TF] = fillmissing(A,'linear','SamplePoints',x);

绘制原始数据和填充的数据。

scatter(x,A)
hold on
scatter(x(TF),F(TF))
legend('Original Data','Filled Data')

使用移动中位数填充缺失的数值数据。

创建样本点向量 x 和包含缺失值的数据向量 A

x = linspace(0,10,200); 
A = sin(x) + 0.5*(rand(size(x))-0.5); 
A([1:10 randi([1 length(x)],1,50)]) = NaN; 

使用窗长度为 10 的移动中位数替换 A 中的 NaN 值,并绘制原始数据和填充的数据。

F = fillmissing(A,'movmedian',10);  
plot(x,F,'.-') 
hold on
plot(x,A,'.-')
legend('Original Data','Filled Data')

定义一个自定义函数,用上一个非缺失值填充 NaN 值。

定义采样点向量 t 和包含 NaN 值的对应数据向量 A。绘制数据图。

t = 10:10:100;
A = [0.1 0.2 0.3 NaN NaN 0.6 0.7 NaN 0.9 1];
scatter(t,A)

使用局部函数 forwardfill(在示例末尾定义)用上一个非缺失值填充缺失空缺。函数句柄输入包括:

  • xs - 用于填充的数据值

  • ts - 用于填充的值相对于采样点的位置

  • tq - 缺失值相对于采样点的位置

  • n - 要填充的空缺中的值的数目

n = 2;
gapwindow = [10 0];

[F,TF] = fillmissing(A,@(xs,ts,tq) forwardfill(xs,ts,tq,n),gapwindow,'SamplePoints',t);

空缺窗值 [10 0] 指示 fillmissing 考虑缺失值空缺之前的一个数据点,不考虑空缺之后的任何数据点,因为上一个非缺失值位于空缺之前 10 个单位。对于第一个空缺,由 fillmissing 确定的函数句柄输入值为:

  • xs = 0.3

  • ts = 30

  • tq = [40 50]

第二个空缺的函数句柄输入值为:

  • xs = 0.7

  • ts = 70

  • tq = 80

绘制原始数据和填充的数据。

scatter(t,A)
hold on
scatter(t(TF),F(TF))

function y = forwardfill(xs,ts,tq,n)
% Fill n values in the missing gap using the previous nonmissing value
y = NaN(1,numel(tq));
y(1:min(numel(tq),n)) = xs;
end

创建包含缺失条目的矩阵并使用线性插值填充各列(第二个维度),一次一行。对于每行,使用该行中距离最近的非缺失值填充前导和尾随缺失值。

A = [NaN NaN 5 3 NaN 5 7 NaN 9 NaN;
     8 9 NaN 1 4 5 NaN 5 NaN 5;
     NaN 4 9 8 7 2 4 1 1 NaN]
A = 3×10

   NaN   NaN     5     3   NaN     5     7   NaN     9   NaN
     8     9   NaN     1     4     5   NaN     5   NaN     5
   NaN     4     9     8     7     2     4     1     1   NaN

F = fillmissing(A,'linear',2,'EndValues','nearest')
F = 3×10

     5     5     5     3     4     5     7     8     9     9
     8     9     5     1     4     5     5     5     5     5
     4     4     9     8     7     2     4     1     1     1

使用不同数据类型填充表变量的缺失值。

创建表,其变量包括 categoricaldoublechar 数据类型。

A = table(categorical({'Sunny'; 'Cloudy'; ''}),[66; NaN; 54],{''; 'N'; 'Y'},[37; 39; NaN],...
    'VariableNames',{'Description' 'Temperature' 'Rain' 'Humidity'})
A=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________

    Sunny               66        {0x0 char}       37   
    Cloudy             NaN        {'N'     }       39   
    <undefined>         54        {'Y'     }      NaN   

用上一个条目的值替换所有缺失的条目。由于 Rain 变量中不存在前一个元素,缺失的字符向量将不会被替换。

F = fillmissing(A,'previous')
F=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________

      Sunny            66         {0x0 char}       37   
      Cloudy           66         {'N'     }       39   
      Cloudy           54         {'Y'     }       39   

ATemperatureHumidity 变量的 NaN 值替换为 0。

F = fillmissing(A,'constant',0,'DataVariables',{'Temperature','Humidity'})
F=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________

    Sunny              66         {0x0 char}       37   
    Cloudy              0         {'N'     }       39   
    <undefined>        54         {'Y'     }        0   

或者,使用 isnumeric 函数识别要对其执行运算的数字变量。

F = fillmissing(A,'constant',0,'DataVariables',@isnumeric)
F=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________

    Sunny              66         {0x0 char}       37   
    Cloudy              0         {'N'     }       39   
    <undefined>        54         {'Y'     }        0   

现在,用包含在元胞数组中的指定常量来填充 A 中每个表变量的缺失值。

F = fillmissing(A,'constant',{categorical({'None'}),1000,'Unknown',1000})
F=3×4 table
    Description    Temperature       Rain        Humidity
    ___________    ___________    ___________    ________

      Sunny             66        {'Unknown'}        37  
      Cloudy          1000        {'N'      }        39  
      None              54        {'Y'      }      1000  

创建以秒为单位的时间向量 t 和对应的包含 NaN 值的数据向量 A

t = seconds([2 4 8 17 98 134 256 311 1001]);
A = [1 3 23 NaN NaN NaN 100 NaN 233];

仅填充 A 中与最大为 250 秒的空缺大小对应的缺失值。由于第二个空缺大于 250 秒,因此不会填充 NaN 值。

F = fillmissing(A,'linear','SamplePoints',t,'MaxGap',seconds(250))
F = 1×9

    1.0000    3.0000   23.0000   25.7944   50.9435   62.1210  100.0000       NaN  233.0000

使用自定义距离函数用最近邻行中的值来填充缺失条目。

创建一个包含 NaN 值的矩阵,然后创建一个逻辑向量来指示第三行中缺失条目的位置。

A = [1 3 9 3; -5 1 7 2; -1 1 7 NaN; 12 1 9 1];
m = isnan(A(3,:));

定义两个自定义函数来测量行之间的距离。

函数 d1 通过合计每个坐标对组之间的距离来测量行之间的距离;函数 dinf 通过查找坐标对组中的最大距离来测量行之间的距离。

d1 = @(x,~) sum(abs(diff(x)),'omitnan');
dinf = @(x,isNaN) norm(diff(x(:,~isNaN(1,:))),'inf');

计算第三行和其他三行中每行之间的 d1 测量距离。第二行距离最近。

d1s = arrayfun(@(r) d1(A([r 3],:),m), setdiff(1:4,3))
d1s = 1×3

     6     4    15

fillmissing 函数将第三行中的 NaN 替换为第二行中对应的 2

F1 = fillmissing(A,'knn','Distance',d1)
F1 = 4×4

     1     3     9     3
    -5     1     7     2
    -1     1     7     2
    12     1     9     1

使用 dinf 测量距离的类似分析发现第一行与第三行距离最近。现在 fillmissing 函数将第三行中的 NaN 替换为第一行中对应的 3。

dinfs = arrayfun(@(r) dinf(A([r 3],:),m), setdiff(1:4,3))
dinfs = 1×3

     2     4    13

Finf = fillmissing(A,'knn','Distance',dinf)
Finf = 4×4

     1     3     9     3
    -5     1     7     2
    -1     1     7     3
    12     1     9     1

自 R2024a 起

创建一个表并填充定义为 -99 的缺失条目。创建一个逻辑变量表 loc,该表指示要填充的缺失条目的位置。然后,使用 MissingLocations 名称-值参量指定 fillmissing 的已知缺失条目位置。

A = [1; 4; 9; -99; 3];
B = [9; 0; 6; 2; 1];
C = [-99; 4; 2; 3; 8];
T = table(A,B,C)
T=5×3 table
     A     B     C 
    ___    _    ___

      1    9    -99
      4    0      4
      9    6      2
    -99    2      3
      3    1      8

loc = T==-99
loc=5×3 table
      A        B        C  
    _____    _____    _____

    false    false    true 
    false    false    false
    false    false    false
    true     false    false
    false    false    false

T = fillmissing(T,"next",MissingLocations=loc)
T=5×3 table
    A    B    C
    _    _    _

    1    9    4
    4    0    4
    9    6    2
    3    2    3
    3    1    8

输入参数

全部折叠

输入数据,指定为向量、矩阵、多维数组、字符向量元胞数组、表或时间表。

  • 如果 A 为时间表,则仅填充表值。如果关联的行时间向量包含 NaTNaN 值,则 fillmissing 会产生错误。行时间必须是唯一的并按升序列出。

  • 如果 A 是元胞数组或包含元胞数组变量的表,则 fillmissing 仅在元胞数组包含字符向量时填充缺失元素。

填充常量,指定为标量、向量或元胞数组。

  • 如果 A 是矩阵或多维数组,则 v 可以是向量,表示每个运算维度的一个不同填充值。v 的长度必须与运算维度的长度相匹配。

  • 如果 A 是表或时间表,则 v 可以是填充值的元胞数组,表示每个变量的一个不同填充值。元胞数组中的元素数必须与表中的变量数目相匹配。

填充方法,指定为下列值之一:

方法描述
'previous'上一个非缺失值
'next'下一个非缺失值
'nearest'x 轴定义的最接近的非缺失值
'linear'相邻非缺失值的线性插值(仅限数值、durationdatetime 数据类型)
'spline'分段三次样条插值(仅限数值、durationdatetime 数据类型)
'pchip'保形分段三次样条插值(仅限数值、durationdatetime 数据类型)
'makima'修正 Akima 三次 Hermite 插值(仅限数值、durationdatetime 数据类型)

填充缺失数据的移动方法,指定为下列值之一:

方法描述
'movmean'窗长度为 window 的移动均值(仅限数值数据类型)
'movmedian'窗长度为 window 的移动中位数(仅限数值数据类型)

移动方法的窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。窗是相对于采样点定义的。

如果 window 是正整数标量,则窗以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗口以当前元素和上一个元素为中心。

如果 window 是由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。

如果 A 是时间表或 SamplePoints 指定为 datetimeduration 向量,则窗口必须为 duration 类型。

'knn' 方法计算平均值的最近邻的数量,指定为正整数标量。

示例: @(xs,ts,tq) myfun(xs,ts,tq)

自定义填充方法,指定为函数句柄。有效的函数句柄必须包括以下三个输入参量:

输入参量描述
xs包含用于填充的数据值的向量。xs 的长度必须与指定窗的长度匹配。
ts包含用于填充的值的位置的向量。ts 的长度必须与指定窗的长度匹配。ts 是采样点向量的子集。
tq包含缺失值位置的向量。tq 是采样点向量的子集。

该函数必须返回标量或与 tq 长度相同的向量。

自定义填充函数的空缺窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。空缺窗是相对于采样点定义的。

为填充方法指定函数句柄 fillfun 时,gapwindow 的值表示围绕输入数据中缺失值的每个空缺的固定窗长度。然后由 fillfun 使用该窗中的值计算填充值。例如,对于默认采样点 t = 1:10 和数据 A = [10 20 NaN NaN 50 60 70 NaN 90 100],窗口长度 gapwindow = 3 将第一个空缺窗指定为 [20 NaN NaN 50]fillfun 对其进行运算以计算填充值。fillfun 进行运算的第二个空缺窗是 [70 NaN 90]

A 是时间表或 SamplePoints 指定为 datetimeduration 向量时,gapwindow 必须为 duration 类型。

运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。

以一个 m×n 输入矩阵 A 为例:

  • fillmissing(A,method,1) 根据 A 的每列中的数据填充缺失值,并返回一个 m×n 矩阵。

    fillmissing(A,method,1) column-wise operation

  • fillmissing(A,method,2) 根据 A 的每行中的数据填充缺失值,并返回一个 m×n 矩阵。

    fillmissing(A,method,2) row-wise operation

对于表或时间表输入数据,不支持 dim,并且分别对每个表或时间表变量进行运算。

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

示例: fillmissing(T,method,SamplePoints="Var1")

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: fillmissing(T,method,"SamplePoints","Var1")

数据选项

全部折叠

采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...] 是默认值。

当输入数据是表时,可以使用以下选项之一将采样点指定为表变量:

索引方案示例

变量名称:

  • 字符串标量或字符向量

  • "A"'A' - 名为 A 的变量

变量索引:

  • 引用变量在表中位置的索引编号

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 一个包含数值的变量

变量类型:

  • vartype 下标,用于选择一个指定类型的变量

  • vartype("numeric") - 一个包含数值的变量

注意

当输入数据为 timetable 时,不支持此名称-值参量。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。

移动窗基于样本点进行定义。例如,如果 t 是与输入数据对应的时间向量,则 fillmissing(rand(1,10),'movmean',3,'SamplePoints',t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗。

当样本点向量的数据类型为 datetimeduration 时,移动窗长度的类型必须为 duration

示例: fillmissing([1 NaN 3 4],'linear','SamplePoints',[1 2.5 3 4])

示例: fillmissing(T,'linear','SamplePoints',"Var1")

数据类型: single | double | datetime | duration

要对其进行操作的表变量,指定为下表中的选项之一。DataVariables 值指示要填充输入表的哪些变量。

表中未由 DataVariables 指定的其他变量会传递给输出,而不会对其进行填充。

索引方案示例

变量名称:

  • 字符串或字符向量

  • 字符串数组或字符向量元胞数组

  • pattern 对象

  • "A"'A' - 名为 A 的变量

  • ["A" "B"]{'A','B'} - 两个名为 AB 的变量

  • "Var"+digitsPattern(1) - 变量名为 "Var" 后跟一个数字

变量索引:

  • 引用变量在表中位置的索引编号

  • 由数字组成的向量

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false 值。

  • 3 - 表中的第三个变量

  • [2 3] - 表中的第二个和第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 所有包含数值的变量

变量类型:

  • vartype 下标,用于选择指定类型的变量

  • vartype("numeric") - 所有包含数值的变量

示例: fillmissing(T,'linear','DataVariables',["Var1" "Var2" "Var4"])

替换值指示符,当 A 是表或时间表时,指定为以下值之一:

  • true1 - 用填充的表变量替换包含缺失条目的输入表变量。

  • false0 - 向输入表追加已检查缺失条目的所有表变量。追加变量中已填充了缺失条目。

对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues

示例: fillmissing(T,'previous','ReplaceValues',false)

缺失值选项

全部折叠

用于处理端点的方法,指定为 'extrap''previous''next''nearest''none' 或常量标量值。端点填充方法根据以下定义处理前导和尾随缺失值:

方法描述
'extrap'method 相同
'previous'上一个非缺失值
'next'下一个非缺失值
'nearest'距离最近的非缺失值
'none'无填充值
标量常量值(仅限数值、durationdatetime 数据类型)

已知缺失条目指示符,指定为逻辑向量、矩阵或多维数组,或具有逻辑变量的表或时间表 (自 R2024a 起)

如果 MissingLocations 是数组,其大小必须与 A 相同。如果 MissingLocations 是表或时间表,它必须包含与要对其进行操作的输入表变量的大小和名称相同的逻辑变量。

值为 1 (true) 的元素表示 A 中缺失条目的位置。值为 0 (false) 的元素表示非缺失条目。

数据类型: logical

要填充的最大空缺大小,指定为数值标量、duration 标量或 calendarDuration 标量。空缺是指一系列连续缺失值,其大小是空缺前后的非缺失值之间的距离。空缺大小是相对于采样点计算得出的。小于或等于最大空缺大小的空缺将被填充,而大于空缺大小的空缺则不会被填充。

例如,假设有使用默认采样点 [1 2 3 4] 的向量 y = [25 NaN NaN 100]。该向量中的空缺大小是基于采样点进行计算的,即 4 - 1 = 3,因此 MaxGap 值为 2 时会保持缺失值不变,而 MaxGap 值为 3 时会填充缺失值。

对于位于数据开头或结尾的缺失值:

  • 输入数据的开头或末尾的单个缺失值的空缺大小为 0,且始终会被填充。

  • 出现在输入数据开头或结尾的缺失值簇并不完全由非缺失值包围,因此会使用最接近的现有采样点来计算空缺大小。对于默认采样点 1:N,此时产生的空缺大小比相同的簇出现在数据中间时小 1。

查找最近邻行时使用的距离函数,指定为 'euclidean'(欧几里德距离)、'seuclidean'(缩放欧几里德距离)或距离函数的函数句柄。

如果为距离函数指定函数句柄,该函数必须满足以下条件:

  • 该函数必须接受两个输入。

  • 函数的第一个输入必须为一个包含两行的矩阵、表或时间表,其中包含两个要比较的向量。

  • 函数的第二个输入必须为逻辑矩阵,表示向量中缺失值的位置。您可以通过将第二个输入指定为 ~ 来忽略它。

  • 该函数必须以 double 类型的实数标量值形式返回距离。

示例: fillmissing(A,'knn','Distance',@(x,~) sum(abs(diff(x)),'omitmissing'))

输出参量

全部折叠

填充的数据,以向量、矩阵、多维数组、表或时间表形式返回。

除非 ReplaceValues 的值为 false,否则 FA 的大小相同。如果 ReplaceValues 的值是 false,则 F 的宽度是输入数据宽度和指定的数据变量数目之和。

填充的数据指示符,以向量、矩阵或多维数组形式返回。TF 是逻辑数组,其中 1 (true) 对应于 F 中以前缺失但已填充的条目,0 (false) 对应于未更改的条目。

TF 的大小与 F 相同。

数据类型: logical

提示

  • 对于非字符向量的结构体数组或元胞数组的输入数据,fillmissing 不填充任何条目。要填充结构体数组中缺失的条目,请使用 structfun 函数将 fillmissing 应用于结构体中的每个字段。要填充非字符向量元胞数组中缺失的条目,请使用 cellfun 函数将 fillmissing 应用于元胞数组中的每个元胞。

替代功能

实时编辑器任务

您可以通过将清洗缺失数据任务添加到实时脚本中,以交互方式使用 fillmissing 功能。

Clean Missing Data task in the Live Editor

扩展功能

版本历史记录

在 R2016b 中推出

全部展开