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 是表,则每个变量的数据类型定义该变量的缺失值。

示例

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')

Figure contains an axes object. The axes object contains 2 objects of type scatter. These objects represent 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')

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent 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)

Figure contains an axes object. The axes object contains an object of type scatter.

使用局部函数 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))

Figure contains an axes object. The axes object contains 2 objects of type scatter.

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

输入参数

全部折叠

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

  • 如果 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 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 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 数据类型)

已知缺失值指示符,指定为与 A 大小相同的逻辑向量、矩阵或多维数组。指示符元素可以为 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 应用于元胞数组中的每个元胞。

扩展功能

版本历史记录

在 R2016b 中推出

全部展开