今、
こういう、どうってことないデータセットがあったとします。
Xは文字型です。
そして、
data A1;
set Q1;
Y=input(X,8.);
run;
というなんてことない処理(Xを数値化してYに割り当てる)を実行します。
結果は
え?
見た目は同じなのに2オブザベーション目だけ欠損値です。
ログにも、確かに欠損値が生成されたNoteはでていますが、
引数が無効と言われても、、。といった感じです。
これ、知らないと一生解決できないんじゃないか系のトラブルです。
以前紹介した「背筋が凍る、厄介でおっかない小数点誤差の話」
http://sas-tumesas.blogspot.jp/2014/03/blog-post_14.html
に似てますね。
実は冒頭のデータセットは
data Q1;
length X $10.;
X='1';output;
X=cats('0A'X,'1');output;
run;
というコードで生成したものです。
ん?2個目のXで、1にくっつけている'0A'Xってなに?
これ、実は改行コードの一部(ラインフィールド)を指定する意味をもった記述なんです。
通常、こいつと'0D'x(キャリッジリターン)を合わせて、改行をさせます。
こういう意味をもった記号があって(タブ('09'x)とか)、そいつらが往々にして
僕らの大切な時間と精神力を奪っていきます。
対策は簡単で
data A2;
set Q1;
Y=input(compress(X,'0A'X || '0D'X),8.);
run;
取り除いてからinputです。
例えば、エクセルからデータを読み込んでデータセットを作る場合なんかによくこの問題が
浮上します。
見栄えをよくするために、結構セル内改行つかったりしていることが多いんですよね。
0 件のコメント:
コメントを投稿