exponenta event banner

Очистить грязные и отсутствующие данные

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

Загрузить данные образца.

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

См. также

| |

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

Подробнее