最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

table 内の乱雑な欠損データの整理

この例では、データが欠損している table 行を検出、整理および削除する方法を示します。

サンプル データの読み込み

コンマ区切りのテキスト ファイル messy.csv からサンプル データを読み込みます。このファイルには、多くの異なる欠損データ インジケーターが含まれています。

  • 空の文字ベクトル ('')

  • ピリオド (.)

  • NA

  • NaN

  • -99

文字ベクトルを空の値として処理するように指定するには、関数 readtable で名前と値のペアの引数 'TreatAsEmpty' を使用します (この例をライブ スクリプトとして実行している場合でも、関数 disp を使用して 21 行すべてを表示します)。

T = readtable('messy.csv','TreatAsEmpty',{'.','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 です。'TreatAsEmpty' は、ファイル内の数値列にのみ適用され、テキストとして指定された数値 ('-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' を数値変数 BD および ENaN と置き換えました。

欠損値インジケーターの置き換え

コード -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 では、さらにその行がアルファベット順に並べられています。

AC が隣同士になるように 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

参考

| | | | | |

関連するトピック