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