|
FREQプロシジャの分類変数の長さ
[OS]ALL
[リリース] 5.18, 6.07, 6.08, 6.09, 6.10
[キーワード] base, datastep, freq, tables, out=, 16, character, trancate, sort, nodupkey, merge, by
[質問]
FREQプロシジャで16文字以上の文字データを分類変数に指定すると、17文字目以降が切り捨てられてしまいます。
元のデータ値のままで分類集計する方法はありませんか。
data mast;
length name $34;
input name $;
cards;
SASランゲージリファレンスガイド
SASランゲージリファレンスガイド
SASプロシジャリファレンスガイド
;
run;
proc freq data=mast;
tables name / out=freqdat noprint;
run;
proc print data=freqdat; run;
SASデータセット:FREQDAT
--------------------------------------
OBS NAME COUNT PERCENT
1 SASプロシジャ 1 33.3333
2 SASランゲージ 2 66.6667
[回答]
分類変数が文字値の場合、FREQプロシジャは最初の16文字だけを分類に使います。これをオプション等で変更することはできません。
このような場合、文字値をいったん別の値に変換し、その値で分類集計を行った後、元の文字値に戻す、という方法が適しています。
この処理の流れを以下に示します。
- 分類変数の各カテゴリに対する別の値を生成します。
SORTプロシジャのNODUPKEYオプションは、重複するキー値の重複を除去します。次のDATAステップでは、各データ値に別々の値(CODE、この場合は連番)を与えます。ここで作成するSASデータセットを[コードテーブル]とします。
proc sort data=mast out=mastout nodupkey;
by name;
run;
data namemast;
set mastout;
code+1;
run;
SASデータセット:NAMEMAST
-------------------------------------------
OBS NAME CODE
1 SASプロシジャリファレンスガイド 1
2 SASランゲージリファレンスガイド 2
- 元のSASデータセットにコードテーブルのCODEを追加します。
proc sort data=mast;
by name;
run;
data mast2;
merge mast namemast;
by name;
run;
SASデータセット:MAST2
-------------------------------------------
OBS NAME CODE
1 SASプロシジャリファレンスガイド 1
2 SASランゲージリファレンスガイド 2
3 SASランゲージリファレンスガイド 2
- 変数NAMEではなく、CODEに対してFREQプロシジャを実行します。
proc freq data=mast2;
tables code / output=freqdat2 noprint;
run;
SASデータセット:FREQDAT2
------------------------------
OBS CODE COUNT PERCENT
1 1 1 33.3333
2 2 2 66.6667
- 集計結果とステップ1で作成したコードテーブルをマージし、CODEから元の名前に変換します。
proc sort data=namemast; by code; run;
data all;
merge freqdat2 namemast;
by code;
run;
SASデータセット:ALL
------------------------------------------------------------
OBS CODE COUNT PERCENT NAME
1 1 1 33.3333 SASプロシジャリファレンスガイド
2 2 2 66.6667 SASランゲージリファレンスガイド
|