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

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

Загрузите выборочные данные.

Импортируйте данные из электронной таблицы 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

См. также

| |

Похожие примеры

Подробнее о