Очистка грязных и пропущенных данных

В этом примере показано, как найти, уберите и удалите наблюдения с недостающими данными в массиве набора данных.

Загрузка демонстрационных данных.

Импортируйте данные из электронной таблицы messy.xlsx.

messyData = dataset('XLSFile',fullfile(matlabroot,'help/toolbox/stats/examples','messy.xlsx'))
messyData = 

    var1          var2          var3         var4          var5
    'afe1'        '3'           'yes'        '3'              3
    'egh3'        '.'           'no'         '7'              7
    'wth4'        '3'           'yes'        '3'              3
    'atn2'        '23'          'no'         '23'            23
    'arg1'        '5'           'yes'        '5'              5
    'jre3'        '34.6'        'yes'        '34.6'        34.6
    'wen9'        '234'         'yes'        '234'          234
    'ple2'        '2'           'no'         '2'              2
    'dbo8'        '5'           'no'         '5'              5
    'oii4'        '5'           'yes'        '5'              5
    'wnk3'        '245'         'yes'        '245'          245
    'abk6'        '563'         ''           '563'          563
    'pnj5'        '463'         'no'         '463'          463
    'wnn3'        '6'           'no'         '6'              6
    'oks9'        '23'          'yes'        '23'            23
    'wba3'        ''            'yes'        'NaN'           14
    'pkn4'        '2'           'no'         '2'              2
    'adw3'        '22'          'no'         '22'            22
    'poj2'        '-99'         'yes'        '-99'          -99
    'bas8'        '23'          'no'         '23'            23
    'gry5'        'NA'          'yes'        'NaN'           21

Когда вы импортируете данные из электронной таблицы, dataset чтения любые переменные с нечисловыми элементами как массив ячеек из символьных векторов. Это то, почему переменная var2 массив ячеек из символьных векторов. При импортировании данных из текстового файла у вас есть больше гибкости, чтобы задать который нечисловые выражения обработать как пропускающий использование опции TreatAsEmpty.

В messy.xlsx существует много различных индикаторов недостающих данных, такой как:

  • Пустые ячейки

  • Период (.)

  • NA

  • NaN

  • -99

Найдите наблюдения с отсутствующими значениями.

Отобразите подмножество наблюдений, которые имеют по крайней мере одно отсутствующее значение с помощью ismissing.

ix = ismissing(messyData,'NumericTreatAsMissing',-99,...
                 'StringTreatAsMissing',{'NaN','.','NA'});
messyData(any(ix,2),:)
ans = 

    var1          var2         var3         var4         var5
    'egh3'        '.'          'no'         '7'            7 
    'abk6'        '563'        ''           '563'        563 
    'wba3'        ''           'yes'        'NaN'         14 
    'poj2'        '-99'        'yes'        '-99'        -99 
    'gry5'        'NA'         'yes'        'NaN'         21 

По умолчанию, ismissing распознает следующие индикаторы отсутствующего значения:

  • NaN для числовых массивов

  • '' для символьных массивов

  • <undefined> для категориальных массивов

Используйте NumericTreatAsMissing и StringTreatAsMissing опции, чтобы задать другие значения, чтобы обработать как пропавшие без вести.

Преобразуйте символьные массивы в двойные массивы.

Можно преобразовать char переменные, которые должны быть числовым использованием str2double.

messyData.var2 = str2double(messyData.var2);
messyData.var4 = str2double(messyData.var4)
messyData = 

    var1          var2    var3         var4    var5
    'afe1'           3    'yes'           3       3
    'egh3'         NaN    'no'            7       7
    'wth4'           3    'yes'           3       3
    'atn2'          23    'no'           23      23
    'arg1'           5    'yes'           5       5
    'jre3'        34.6    'yes'        34.6    34.6
    'wen9'         234    'yes'         234     234
    'ple2'           2    'no'            2       2
    'dbo8'           5    'no'            5       5
    'oii4'           5    'yes'           5       5
    'wnk3'         245    'yes'         245     245
    'abk6'         563    ''            563     563
    'pnj5'         463    'no'          463     463
    'wnn3'           6    'no'            6       6
    'oks9'          23    'yes'          23      23
    'wba3'         NaN    'yes'         NaN      14
    'pkn4'           2    'no'            2       2
    'adw3'          22    'no'           22      22
    'poj2'         -99    'yes'         -99     -99
    'bas8'          23    'no'           23      23
    'gry5'         NaN    'yes'         NaN      21
Теперь var2 и var4 числовые массивы. Во время преобразования, str2double заменяет нечисловые элементы переменных var2 и var4 со значением NaN. Однако нет никаких изменений в числовом индикаторе отсутствующего значения, -99.

При применении той же функции ко многим переменным типа массив набора данных может иногда быть более удобно использовать datasetfun. Например, чтобы преобразовать оба var2 и var4 к числовым массивам одновременно, можно использовать:

messyData(:,[2,4]) = datasetfun(@str2double,messyData, ...
    'DataVars',[2,4],'DatasetOutput',true);

Замена индикаторов отсутствующего значения.

Уберите данные так, чтобы отсутствующие значения, обозначенные кодом -99 имейте стандартный MATLAB® числовой индикатор отсутствующего значения, NaN.

messyData = replaceWithMissing(messyData,'NumericValues',-99)
messyData = 

    var1          var2    var3         var4    var5
    'afe1'           3    'yes'           3       3
    'egh3'         NaN    'no'            7       7
    'wth4'           3    'yes'           3       3
    'atn2'          23    'no'           23      23
    'arg1'           5    'yes'           5       5
    'jre3'        34.6    'yes'        34.6    34.6
    'wen9'         234    'yes'         234     234
    'ple2'           2    'no'            2       2
    'dbo8'           5    'no'            5       5
    'oii4'           5    'yes'           5       5
    'wnk3'         245    'yes'         245     245
    'abk6'         563    ''            563     563
    'pnj5'         463    'no'          463     463
    'wnn3'           6    'no'            6       6
    'oks9'          23    'yes'          23      23
    'wba3'         NaN    'yes'         NaN      14
    'pkn4'           2    'no'            2       2
    'adw3'          22    'no'           22      22
    'poj2'         NaN    'yes'         NaN     NaN
    'bas8'          23    'no'           23      23
    'gry5'         NaN    'yes'         NaN      21

Создайте массив набора данных с полными наблюдениями.

Создайте новый массив набора данных, который содержит только полные наблюдения — те без недостающих данных.

ix = ismissing(messyData);
completeData = messyData(~any(ix,2),:)
completeData = 

    var1          var2    var3         var4    var5
    'afe1'           3    'yes'           3       3
    'wth4'           3    'yes'           3       3
    'atn2'          23    'no'           23      23
    'arg1'           5    'yes'           5       5
    'jre3'        34.6    'yes'        34.6    34.6
    'wen9'         234    'yes'         234     234
    'ple2'           2    'no'            2       2
    'dbo8'           5    'no'            5       5
    'oii4'           5    'yes'           5       5
    'wnk3'         245    'yes'         245     245
    'pnj5'         463    'no'          463     463
    'wnn3'           6    'no'            6       6
    'oks9'          23    'yes'          23      23
    'pkn4'           2    'no'            2       2
    'adw3'          22    'no'           22      22
    'bas8'          23    'no'           23      23

Смотрите также

| |

Связанные примеры

Больше о