缺失值的处理

当变量存在缺失值时,有的函数不能正常执行,此时,需要先对缺失值进行处理,删除或填充。缺失值的处理包括发现缺失值、删除缺失值和填充缺失值等操作。[大谦MATLAB,dqmatlab点com]

发现缺失值

用ismissing函数发现缺失值。该函数的调用格式为:

TF = ismissing(A) 返回逻辑数组,指示数组或表中的哪些元素包含缺失值。TF的大小与 A的大小相同。

标准缺失值取决于数据类型:

double, single, duration和calendarDuration的指示符为NaN

datetime 的指示符为 NaT

string 的指示符为 <missing>

categorical 的指示符为 <undefined>

char 的指示符为' '

字符向量 cell 的指示符为 { ' '}

TF = ismissing(A,indicator) 将indicator中的值视为缺失值指示符,而忽略上述语法中列出的所有默认指示符。Indicator可以是单个指示符,也可以是多个指示符。例如,如果A是double类型的数组,则ismissing(A,[0,-99])会将0和-99视为缺失的double值,而不是将 NaN视为缺失值。

下面给出一些包含缺失值的数据,用ismissing函数找出这些缺失值。

数据为数值类型的情况:

code.matlab
>> a = [NaN 2 3 NaN 5 6];
>> ismissing(a)
ans =
   1   0   0   1   0   0

数据为字符串的情况:

code.matlab
>> b = {'one' 'two' '' 'four' 'five' 'six'};
>> ismissing(b)
ans =
   0   0   1   0   0   0

数据为日期的情况:

code.matlab
>> m = [1:2:10];
>> c = [datetime(2021,m,12) NaT];
>> ismissing(c)
ans =
   0   0   0   0   0   1

上面返回的结果中,有缺失值的位置用1表示。

删除缺失值

如果希望删除缺失值,使用rmmissing函数。该函数的调用格式为:

R = rmmissing(A) 从数组或表中删除缺失的条目。如果A是向量,则rmmissing会删除包含缺失数据的所有条目。如果A是矩阵或表,则rmmissing会删除包含缺失数据的所有行。缺失值的定义取决于A的数据类型:

NaN - double、single、duration和calendarDuration

NaT - datetime

<missing> - string

<undefined> - categorical

' ' - char

{''} - 字符数组的cell

R = rmmissing(A,dim) 指定要沿其进行运算的A的维度。默认情况下,rmmissing沿其大小不为1的第一个维度进行运算。

R = rmmissing(___,Name,Value) 使用一个或多个名称-值对组参数指定用来删除缺失条目的其他参数。例如,您可以使用rmmissing('MinNumMissing',n)删除至少包含n个缺失值的行。

[R,TF] = rmmissing(___) 还返回与A中被删除的行或列对应的逻辑向量。

在MATLAB命令窗口输入下面的代码,创建包含缺失值的向量,然后删除缺失值。

code.matlab
>> A = [2 3 4 NaN 6 NaN];
>> R = rmmissing(A)
R =
     2     3     4		6

补充缺失值

用fillmissing函数对缺失值进行填充。该函数的调用格式为:

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

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

NaN - double、single、duration 和 calendarDuration

NaT - datetime

<missing> - string

<undefined> - categorical

' ' - char

{''} - 字符数组的cell

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

F = fillmissing(A,method) 使用method指定的方法填充缺失的条目,该方法可能是下列各项之一:

'previous' - 上一个非缺失值

'next' - 下一个非缺失值

'nearest' - 距离最近的非缺失值

'linear' - 相邻非缺失值的线性插值(仅限数值、duration和datetime数据类型)

'spline' - 分段三次样条插值(仅限数值、duration和datetime数据类型)

'pchip' - 保形分段三次样条插值(仅限数值、duration和datetime数据类型)

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条目的逻辑数组。

下面的代码取缺失值前面的值进行填充。在命令窗口键入:

code.matlab
>> A = [1 2 NaN 4 NaN 6 NaN 8];
>> F= fillmissing(A,'previous')
F=
     1     2     2     4     4     6     6     8