В этом примере показано, как находить, очищать и удалять наблюдения с отсутствующими данными в массиве наборов данных.
Импорт данных из электронной таблицы 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 21var2 и 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 23dataset | ismissing | replaceWithMissing