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文字だけを分類に使います。これをオプション等で変更することはできません。
このような場合、文字値をいったん別の値に変換し、その値で分類集計を行った後、元の文字値に戻す、という方法が適しています。 この処理の流れを以下に示します。

  1. 分類変数の各カテゴリに対する別の値を生成します。
    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
           

  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
           

  3. 変数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
           

  4. 集計結果とステップ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ランゲージリファレンスガイド