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