R2020a の readtable 関数で読み込んだファイルで、テキストデータが NaNになるのはなぜですか?

29 views (last 30 days)
数値データとテキストデータを含む列を持つExcelスプレッドシートファイルで読み込んでいます。
値の順序によって、R2020a の readtable 関数は、異なるデータ型を選択するようです。
例えば、スプレッドシート内のデータが
COL_1 | COL_2
TEXT_1 | 2
TEXT_2 | TEXT
-1 | 2
の場合、readtable 関数で読み込むと、以下の結果となります。
>> readtable('MixedInputs.xlsx')
ans =
3×2 table
COL_1 COL_2
________ _____
{'TEXT_1'} 2
{'TEXT_2'} NaN
{'-1' } 2
列 COL_1は、すべてのデータを文字ベクトルとしてインポートしていますが、列 COL_2 では、文字列 "TEXT"が欠損値 NaN として読み込まれてしまいます。
R2019b 以前のバージョンでは、正しく文字列として読み込まれていました。

Accepted Answer

MathWorks Support Team
MathWorks Support Team on 28 Dec 2021
これは、R2020a 以降のリリースの仕様に基づいた意図した動作です。
readtable 関数は、自動判定により2列目で検出された値に適したデータ型は数値配列であると判断しましたが、"TEXT"は数値ではないため、適切な欠損値(数値変数には NaN、文字列には空の文字ベクトル)となります。
適切な対応方法としては、以下の方法があります。
方法 1:
文字ベクトル列または文字列列を持つテーブルを取得するため、'setvartype' ファイル インポート オプションを使用します:
>> filename = 'MixedInputs.xlsx';
>> opts = detectImportOptions(filename);
>> opts = setvartype(opts,'char'); % or 'string'
>> T = readtable(filename,opts)
T =
3×2 table
COL_1 COL_2
________ ________
{'TEXT_1'} {'2' }
{'TEXT_2'} {'TEXT'}
{'-1' } {'2' }
'setvartype' については以下の URL をご覧ください。
方法2:
今回のようにテーブルデータにテキストヘッダがある場合、('Format','auto')という名前と値のペアの引数を指定すれば、以前のリリースのデフォルトの動作と同じ結果を得ることが可能です。
 
>> T = readtable('MixedInputs.xlsx','Format','auto')
T =
3×2 table
COL_1 COL_2
________ ________
{'TEXT_1'} {'2' }
{'TEXT_2'} {'TEXT'}
{'-1' } {'2' }
テキスト ファイルの名前と値のペア引数に関する詳細については、次のドキュメント ページを参照してください。
方法3:
1 つの列に文字列と数値が混在している場合は、readtable 関数が適切でない可能性があります。readcell 関数を用いて、セル配列としてデータを表す方法をご検討下さい。
 
>> C = readcell('MixedInputs.xlsx')
C =
4×2 cell array
{'COL_1'} {'COL_2'}
{'TEXT_1' } {[ 2]}
{'TEXT_2' } {'TEXT' }
{[ -1]} {[ 2]}
readcell については、以下の URL をご覧ください。

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!