3

20 個の文字変数を持つ SAS データセットがあり、そのすべてが名前です (例: Adam、Bob、Cathy など)。

Adam_ref、Bob_ref などと呼ばれる変数を作成する動的コードが必要です。これは、異なる名前の異なるデータセットがある場合でも機能します (つまり、各変数を手動で定義したくない)。

これまでの私のアプローチは、proc コンテンツを使用してすべての変数名を取得し、マクロを使用してマクロ変数 Adam_ref、Bob_ref などを作成することでした。

ここからデータセット内に実際の変数を作成するにはどうすればよいですか? 別のアプローチが必要ですか?

proc contents data=work.names 
               out=contents noprint;
run;

proc sort data = contents; by varnum; run;

data contents1;
  set contents;
  Name_Ref = compress(Name||"_Ref");
  call symput (NAME, NAME_Ref); 
  %put _user_;
run;
4

3 に答える 3

2

マクロ変数にある値のような名前の変数を持つ空のデータセットを作成する場合は、次のようにすることができます。

v1値を、、などのパターンで名前が付けられたマクロ変数に保存しますv2

proc sql;
select compress(Name||"_Ref") into :v1-:v20 from contents;
quit;

値がいくつあるかわからない場合は、最初にそれらを数える必要があります。20個しかないことを前提としています。

次に、すべての変数が長さ100の文字変数である場合、次のようなデータセットを作成します。

%macro create_dataset;
data want;
length %do i=1 %to 20; &&v&i $100 %end;
;
stop;
run;
%mend;

%create_dataset; run; 

これは、マクロ変数に値がある場合に実行できる方法です。一般的には、おそらくより良い方法があります。

空のデータセットを作成せず、変数名のみを変更する場合は、次のように行うことができます。

proc sql;
select name into :v1-:v20 from contents;
quit;

%macro rename_dataset;
data new_names;
set have(rename=(%do i=1 %to 20; &&v&i = &&v&i.._ref %end;));
run;
%mend;

%rename_dataset; run;
于 2013-03-17T17:40:30.957 に答える
2

ID ステートメントで PROC TRANSPOSE を使用できます。

この手順では、サンプル データセットを作成します。

data names;
    harry="sally";
    dick="gordon";
    joe="schmoe";
run;

このステップは基本的に、列名のデータセットを生成する上記のステップのコピーです。全体でデータセットの nameref を再利用します。

proc contents data=names out=namerefs noprint;
run;

この手順では、前に定義した名前に「_Refs」を追加し、それ以外はすべて削除します。変数「name」は、PROC CONTENTS によって出力されたデータセットの列属性から取得されます。

data namerefs;
    set namerefs (keep=name);
    name=compress(name||"_Ref");
run;

この手順により、目的の列を含む空のデータセットが生成されます。変数 " name " は、列の属性を調べることによって再び取得されます。データセットを表示しようとすると、GUI で無害な警告が表示される場合がありますが、それ以外の場合は必要に応じて使用でき、目的の出力が得られていることを確認できます。

proc transpose out=namerefs(drop=_name_) data=namerefs;
  id name;
run;
于 2013-03-18T02:17:37.943 に答える
1

これは、コーディングをあまり必要としない別のアプローチです。proc コンテンツを実行する必要はなく、変数の数を知る必要も、マクロ関数を作成する必要もありません。また、いくつかの追加のことを行うために拡張することもできます。

ステップ 1 では、組み込みのディクショナリ ビューを使用して、目的の変数名を取得します。これに適したビューは、sashelp.vcolumn の別名を持つ dictionary.columns です。ディクショナリ libref は proc sql でのみ使用できますが、sashelp エイリアスはどこでも使用できます。私は DMS を使用して Windows で作業しており、常に sashelp ライブラリをインタラクティブに表示できるため、sashelp エイリアスを使用する傾向があります。

proc sql;
  select compress(Name||"_Ref") into :name_list
                                separated by ' '
    from sashelp.vcolumn
   where libname = 'WORK' 
     and memname = 'NAMES';
quit;

これにより、目的の名前で使用できるスペース区切りのマクロが生成されます。

ステップ 2 空のデータ セットを構築するには、次のコードが機能します。

Data New ;
  length &name_list ;
run ;

少し複雑な select ステートメントを使用することで、長さの仮定を回避したり、新しい変数名を使用して入力済みのデータセットを作成したりできます。

例えば

 select compress(Name)||"_Ref $")||compress(put(length,best.)) 
                 into :name_list
                 separated by ' '

各変数の以前の長さを保持するマクロ変数を生成します。これは、上記の手順 2 を変更しなくても機能します。

データセットの名前変更オプションで使用するデータ セットを作成するには、select ステートメントを次のように置き換えます。

 select compress(Name)||"= "||compress(_Ref") 
                   into :name_list
                   separated by ' '

次に、ステップ 2 のコードを次のコードに置き換えます。

Data New ;
  set names (rename = ( &name_list)) ;
run ;
于 2013-09-06T16:42:19.367 に答える