Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

fillmissing

填充缺失值

说明

示例

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

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

  • NaN - doublesingledurationcalendarDuration

  • NaTdatetime

  • <missing>string

  • <undefined>categorical

  • ' 'char

  • {''} - 字符数组的 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,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(___) 还会返回对应于填充的 A 条目的逻辑数组。

示例

全部折叠

创建包含 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);

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

plot(x,A,'.', x(TF),F(TF),'o')
xlabel('x');
ylabel('sin(x)')
legend('Original Data','Filled Missing Data')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original Data, Filled Missing 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,'r.-',x,A,'b.-') 
legend('Filled Missing Data','Original Data')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Filled Missing Data, Original 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];
plot(t,A,'o')

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

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

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

plot(t,A,'o',t(TF),F(TF),'ro')

Figure contains an axes. The axes contains 2 objects of type line.

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

输入参数

全部折叠

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

当输入参数是元胞数组时,它必须为字符向量元胞数组。如果 A 为时间表,则仅填充表值。如果关联的行时间向量包含 NaTNaN 值,则 fillmissing 会产生错误。行时间必须是唯一的并按升序列出。

数据类型:double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | cell | table | timetable | categorical | datetime | duration | calendarDuration

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

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

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

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | cell | categorical | datetime | duration

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

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

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

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

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

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

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

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

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

如果 window 是正整数标量,则窗以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗以当前元素和上一个元素为中心。如果 window 是由正整数组成的二元素向量 [b f],则窗包含当前元素、其之前的 b 个元素和之后的 f 个元素。

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

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | duration

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

为填充方法指定函数句柄 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 向量时,window 必须为 duration 类型。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | duration

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

A 为表或时间表时,不支持 dimfillmissing 分别对每个表或时间表变量进行运算。

以一个二维输入数组 A 为例。

  • 如果 dim=1,则 fillmissing 逐列填充 A

  • 如果 dim=2,则 fillmissing 逐行填充 A

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: fillmissing(A,'DataVariables',{'Temperature','Altitude'}) 仅填充对应于输入表的 TemperatureAltitude 变量的列
数据选项

全部折叠

样本点,指定为逗号分隔的对组,其中包含 'SamplePoints' 和一个向量。样本点代表数据在 A 中的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。默认采样点向量是 [1 2 3 ...]

注意

当输入数据为 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])

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

要对其执行操作的表变量,指定为逗号分隔的对组,其中包含 'DataVariables' 和下表中的选项之一。'DataVariables' 值指示要填充输入表的哪些变量。表中未由 'DataVariables' 指定的其他变量会传递给输出,而不会对其进行操作。

选项说明示例
变量名称

指定单个表变量名称的字符向量或标量字符串

'Var1'

"Var1"

变量名称的向量

字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

{'Var1' 'Var2'}

["Var1" "Var2"]

变量索引的标量或向量

表变量索引的标量或向量

1

[1 3 5]

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

[true false true]

函数句柄

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

@isnumeric

vartype 下标

vartype 函数生成的表下标

vartype('numeric')

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

缺失值选项

全部折叠

用于处理端点的方法,指定为逗号分隔的对组,包含 'EndValues' 和以下值之一:'extrap''previous''next''nearest''none',或常量标量值。端点填充方法根据以下定义处理前导和尾随缺失值:

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

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | datetime | duration

已知缺失值指示符,指定为逗号分隔的对组,其中包含 'MissingLocations' 和一个逻辑向量、矩阵或大小与 A 相同的多维数组。指示符元素可以为 true,指示缺失值位于 A 中的对应位置,否则为 false

数据类型: logical

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

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

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

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

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

输出参数

全部折叠

填充的数据,以向量、矩阵、多维数组、表或时间表形式返回。F 的大小与 A 相同。

数据类型:double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | cell | table | timetable | categorical | datetime | duration | calendarDuration

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

数据类型: logical

扩展功能

在 R2016b 中推出