R2020a の readtable 関数で読み込んだファイルで、テキストデータが NaNになるのはなぜですか?
75 views (last 30 days)
Show older comments
MathWorks Support Team
on 28 Dec 2021
Answered: MathWorks Support Team
on 28 Dec 2021
数値データとテキストデータを含む列を持つ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
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 をご覧ください。
0 Comments
More Answers (0)
See Also
Categories
Find more on スプレッドシート in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!