Main Content

本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

fillmissing

填充缺失值

说明

示例

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

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

  • NaN - doublesingledurationcalendarDuration

  • NaT - datetime

  • <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(___,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

使用插值来替换非均匀采样的数据中的 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')

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

创建样本点向量 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')

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

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 为时间表,则仅填充表值。如果关联的行时间向量包含 NaTNaN 值,则 fillmissing 会产生错误。行时间必须是唯一的并按升序列出。

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

填充常量,指定为标量、向量或元胞数组。如果 A 为矩阵或多维数组,则 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 的移动中位数(仅限数值数据类型)

窗口长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。

如果 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

沿其运算的维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 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 变量的列

用于处理端点的方法,指定为逗号分隔的对组,包含 '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

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

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

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

当输入数据为时间表时,不支持此名称-值对组。

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

要填充的表变量,指定为逗号分隔的对组,包含 'DataVariables' 和变量名称、变量名称元胞数组、数值向量、逻辑向量、函数句柄或表 vartype 下标。'DataVariables' 值表示要填充输入表的哪些列,可以是下列值之一:

  • 指定单个表变量名称的字符向量

  • 字符向量元胞数组,其中每个元素都是表变量名称

  • 表变量索引向量

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

  • 返回逻辑标量的函数句柄,例如 @isnumeric

  • vartype 下标

示例: 'Age'

示例: {'Height','Weight'}

示例: @iscategorical

示例: vartype('numeric')

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

数据类型: logical

输出参数

全部折叠

填充的数据,以向量、矩阵、多维数组、表或时间表形式返回。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 中推出