当变量存在缺失值时,有的函数不能正常执行,此时,需要先对缺失值进行处理,删除或填充。缺失值的处理包括发现缺失值、删除缺失值和填充缺失值等操作。[大谦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函数找出这些缺失值。
数据为数值类型的情况:
>> a = [NaN 2 3 NaN 5 6];
>> ismissing(a)
ans =
1 0 0 1 0 0
数据为字符串的情况:
>> b = {'one' 'two' '' 'four' 'five' 'six'};
>> ismissing(b)
ans =
0 0 1 0 0 0
数据为日期的情况:
>> 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命令窗口输入下面的代码,创建包含缺失值的向量,然后删除缺失值。
>> 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条目的逻辑数组。
下面的代码取缺失值前面的值进行填充。在命令窗口键入:
>> A = [1 2 NaN 4 NaN 6 NaN 8];
>> F= fillmissing(A,'previous')
F=
1 2 2 4 4 6 6 8