MATLAB 中的缺失数据
处理缺失数据是数据预处理中的常见任务。有时缺失值表示数据中有意义的事件,但它们通常表示不可靠或不可用的数据点。对于以上两种情况,MATLAB® 都提供了许多处理缺失数据的选项。
创建并组织缺失数据
MATLAB 中缺失值的形式取决于数据类型。例如,数值数据类型(例如 double
)使用 NaN
(非数字)表示缺失值。
x = [NaN 1 2 3 4];
您也可以使用 missing
值表示缺失数值数据或其他类型的数据,例如 datetime
、string
和 categorical
。MATLAB 自动将 missing
值转换为数据的原生类型。
xDouble = [missing 1 2 3 4]
xDouble = 1×5
NaN 1 2 3 4
xDatetime = [missing datetime(2014,1:4,1)]
xDatetime = 1x5 datetime
NaT 01-Jan-2014 01-Feb-2014 01-Mar-2014 01-Apr-2014
xString = [missing "a" "b" "c" "d"]
xString = 1x5 string
<missing> "a" "b" "c" "d"
xCategorical = [missing categorical({'cat1' 'cat2' 'cat3' 'cat4'})]
xCategorical = 1x5 categorical
<undefined> cat1 cat2 cat3 cat4
数据集可能包含要作为缺失数据处理的值,但这些值不是 MATLAB 中的标准 MATLAB 缺失值,例如 NaN
。您可以使用 standardizeMissing
函数将这些值转换为该数据类型的标准缺失值。例如,除 NaN
之外,将 4 也处理为缺失的 double
值。
xStandard = standardizeMissing(xDouble,[4 NaN])
xStandard = 1×5
NaN 1 2 3 NaN
假设您要将缺失值保留为数据集的一部分,但将其与其余数据隔离。您可以使用几个 MATLAB 函数控制缺失值的位置,然后再进一步处理。例如,将 'MissingPlacement'
选项与 sort
函数结合使用,可将 NaN
移动到数据的末尾。
xSort = sort(xStandard,'MissingPlacement','last')
xSort = 1×5
1 2 3 NaN NaN
查找、替换和忽略缺失数据
即使您没有在 MATLAB 中显式创建缺失值,在导入现有数据或使用数据进行计算时也会显示缺失值。如果您不知道数据中有缺失值,后续计算或分析可能会产生误导。
例如,如果您对某向量绘图而不知道其中包含 NaN
值,则不会显示 NaN
,因为 plot
函数会忽略它而正常绘制其余点。
nanData = [1:9 NaN]; plot(1:10,nanData)
但是,如果您计算数据的平均值,则结果为 NaN
。在这种情况下,最好事先知道数据包含 NaN
,然后在计算平均值之前选择忽略或删除它。
meanData = mean(nanData)
meanData = NaN
在数据中查找 NaN
的一种方法是使用 isnan
函数,该函数返回一个逻辑数组,指示 NaN
值的位置。
TF = isnan(nanData)
TF = 1x10 logical array
0 0 0 0 0 0 0 0 0 1
同样,ismissing
函数返回多个数据类型的数据中缺失值的位置。
TFdouble = ismissing(xDouble)
TFdouble = 1x5 logical array
1 0 0 0 0
TFdatetime = ismissing(xDatetime)
TFdatetime = 1x5 logical array
1 0 0 0 0
假设您正在处理由多个数据类型的变量组成的表或时间表。您可以通过调用一次 ismissing
找到所有缺失值,而不管其类型如何。
xTable = table(xDouble',xDatetime',xString',xCategorical')
xTable=5×4 table
Var1 Var2 Var3 Var4
____ ___________ _________ ___________
NaN NaT <missing> <undefined>
1 01-Jan-2014 "a" cat1
2 01-Feb-2014 "b" cat2
3 01-Mar-2014 "c" cat3
4 01-Apr-2014 "d" cat4
TF = ismissing(xTable)
TF = 5x4 logical array
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
缺失值可以表示不可用于处理或分析的数据。使用 fillmissing
将缺失值替换为另一个值,或者使用 rmmissing
删除全部缺失值。
xFill = fillmissing(xStandard,'constant',0)
xFill = 1×5
0 1 2 3 0
xRemove = rmmissing(xStandard)
xRemove = 1×3
1 2 3
许多 MATLAB 函数都可以忽略缺失值,您不必首先显式定位、填充或删除它们。例如,如果计算含有 NaN
值的向量的和,则结果为 NaN
。但是,您可以结合使用 sum
函数和 'omitnan'
选项来直接忽略和中的 NaN
。
sumNan = sum(xDouble)
sumNan = NaN
sumOmitnan = sum(xDouble,'omitnan')
sumOmitnan = 10
另请参阅
ismissing
| fillmissing
| standardizeMissing
| missing