このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
table 内の乱雑な欠損データの整理
この例では、データが欠損している table 行を検出、整理および削除する方法を示します。
サンプル データの読み込み
コンマ区切りのテキスト ファイル messy.csv
からサンプル データを読み込みます。このファイルには、多くの異なる欠損データ インジケーターが含まれています。
空の文字ベクトル ('')
ピリオド (.)
NA
NaN
-99
文字ベクトルを空の値として処理するように指定するには、関数 readtable
で名前と値のペアの引数 'TreatAsMissing'
を使用します。(この例をライブ スクリプトとして実行している場合でも、関数 disp
を使用して 21 行すべてを表示します。)
T = readtable('messy.csv','TreatAsMissing',{'.','NA'}); disp(T)
A B C D E ________ ____ __________ ____ ____ {'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 {0x0 char} 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
T
は 21 行と 5 個の変数で構成された table です。'TreatAsMissing'
は、ファイル内の数値列にのみ適用され、テキストとして指定された数値 ('-99'
など) は処理できません。
table の集計
関数 summary
を使用して table 一覧を作成することで、各変数のデータ型、説明、単位およびその他の記述統計を表示します。
summary(T)
Variables: A: 21x1 cell array of character vectors B: 21x1 double Values: Min -99 Median 14 Max 563 NumMissing 3 C: 21x1 cell array of character vectors D: 21x1 double Values: Min -99 Median 7 Max 563 NumMissing 2 E: 21x1 double Values: Min -99 Median 14 Max 563
ファイルからデータをインポートする場合、既定では、readtable
は数値以外の要素をもつ変数があると、それを文字ベクトルの cell 配列として読み取ります。
欠損値がある行の検出
table T
で欠損値が少なくとも 1 つある行のサブセットを表示します。
TF = ismissing(T,{'' '.' 'NA' NaN -99}); rowsWithMissing = T(any(TF,2),:); disp(rowsWithMissing)
A B C D E ________ ___ __________ ___ ___ {'egh3'} NaN {'no' } 7 7 {'abk6'} 563 {0x0 char} 563 563 {'wba3'} NaN {'yes' } NaN 14 {'poj2'} -99 {'yes' } -99 -99 {'gry5'} NaN {'yes' } NaN 21
readtable
は、'.'
と 'NA'
を数値変数 B
、D
および E
の NaN
と置き換えました。
欠損値インジケーターの置き換え
コード -99
で表されている欠損値に標準の MATLAB® 数値欠損値インジケーター NaN
が適用されるようにデータを整理します。
T = standardizeMissing(T,-99); disp(T)
A B C D E ________ ____ __________ ____ ____ {'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 {0x0 char} 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
standardizeMissing
によって -99
の 3 つのインスタンスが NaN
と置き換えられます。
欠損値を table の前の行からの値に置き換えた table T2
を新規作成します。fillmissing
には欠損値を埋める方法がいくつか用意されています。
T2 = fillmissing(T,'previous');
disp(T2)
A B C D E ________ ____ _______ ____ ____ {'afe1'} 3 {'yes'} 3 3 {'egh3'} 3 {'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 {'yes'} 563 563 {'pnj5'} 463 {'no' } 463 463 {'wnn3'} 6 {'no' } 6 6 {'oks9'} 23 {'yes'} 23 23 {'wba3'} 23 {'yes'} 23 14 {'pkn4'} 2 {'no' } 2 2 {'adw3'} 22 {'no' } 22 22 {'poj2'} 22 {'yes'} 22 22 {'bas8'} 23 {'no' } 23 23 {'gry5'} 23 {'yes'} 23 21
欠損値がある行の削除
T
の欠損値を含まない行のみで table T3
を新規作成します。T3
の行数は 16 行のみです。
T3 = rmmissing(T); disp(T3)
A B C D E ________ ____ _______ ____ ____ {'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
T3
には 16 行で 5 個の変数が含まれています。
データの整理
T3
の行を C
の降順に並べ替え、次に A
の昇順に並べ替えます。
T3 = sortrows(T2,{'C','A'},{'descend','ascend'}); disp(T3)
A B C D E ________ ____ _______ ____ ____ {'abk6'} 563 {'yes'} 563 563 {'afe1'} 3 {'yes'} 3 3 {'arg1'} 5 {'yes'} 5 5 {'gry5'} 23 {'yes'} 23 21 {'jre3'} 34.6 {'yes'} 34.6 34.6 {'oii4'} 5 {'yes'} 5 5 {'oks9'} 23 {'yes'} 23 23 {'poj2'} 22 {'yes'} 22 22 {'wba3'} 23 {'yes'} 23 14 {'wen9'} 234 {'yes'} 234 234 {'wnk3'} 245 {'yes'} 245 245 {'wth4'} 3 {'yes'} 3 3 {'adw3'} 22 {'no' } 22 22 {'atn2'} 23 {'no' } 23 23 {'bas8'} 23 {'no' } 23 23 {'dbo8'} 5 {'no' } 5 5 {'egh3'} 3 {'no' } 7 7 {'pkn4'} 2 {'no' } 2 2 {'ple2'} 2 {'no' } 2 2 {'pnj5'} 463 {'no' } 463 463 {'wnn3'} 6 {'no' } 6 6
C
では、'yes'
でグループ化された行の次に、'no'
でグループ化された行が並べられています。A
では、さらにその行がアルファベット順に並べられています。
A
と C
が隣同士になるように table を並べ替えます。
T3 = T3(:,{'A','C','B','D','E'}); disp(T3)
A C B D E ________ _______ ____ ____ ____ {'abk6'} {'yes'} 563 563 563 {'afe1'} {'yes'} 3 3 3 {'arg1'} {'yes'} 5 5 5 {'gry5'} {'yes'} 23 23 21 {'jre3'} {'yes'} 34.6 34.6 34.6 {'oii4'} {'yes'} 5 5 5 {'oks9'} {'yes'} 23 23 23 {'poj2'} {'yes'} 22 22 22 {'wba3'} {'yes'} 23 23 14 {'wen9'} {'yes'} 234 234 234 {'wnk3'} {'yes'} 245 245 245 {'wth4'} {'yes'} 3 3 3 {'adw3'} {'no' } 22 22 22 {'atn2'} {'no' } 23 23 23 {'bas8'} {'no' } 23 23 23 {'dbo8'} {'no' } 5 5 5 {'egh3'} {'no' } 3 7 7 {'pkn4'} {'no' } 2 2 2 {'ple2'} {'no' } 2 2 2 {'pnj5'} {'no' } 463 463 463 {'wnn3'} {'no' } 6 6 6
参考
readtable
| summary
| ismissing
| sortrows
| standardizeMissing
| rmmissing
| fillmissing