Main Content

MATLAB 中的缺失数据

处理缺失数据是数据预处理中的常见任务。有时缺失值表示数据中有意义的事件,但它们通常表示不可靠或不可用的数据点。对于以上两种情况,MATLAB® 都提供了许多处理缺失数据的选项。

创建并组织缺失数据

MATLAB 中缺失值的形式取决于数据类型。例如,数值数据类型(例如 double)使用 NaN(非数字)表示缺失值。

x = [NaN 1 2 3 4];

您也可以使用 missing 值表示缺失数值数据或其他类型的数据,例如 datetimestringcategorical。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)

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

但是,如果您计算数据的平均值,则结果为 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

另请参阅

| | |

相关主题