2

データ ステップの実行中に、データセットの特定の値を含む文字列変数を作成する方法を探しています。

サンプル データ セット work.test:

AddToStringYN    Value
     Y           One
     Y           Two
     N           Three
     Y           Four
     N           Five

最終的に、変数は次のようになります: OneTwoFour (またはさらに良い FourTwoOne)。これはとても簡単に見えますが、それを行う方法を見つけることができないようです。また、次のようなマクロ変数を操作しようとしました。

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar',"&stringvar" || strip(value));
  end;
Run;

しかし、これは次のようになります。

GLOBAL STRINGVAR Four

したがって、最後の値のみを取得します。これは、このマクロ機能に関する私の誤解が原因であるに違いないと思いますが、変数に最後の値しかない理由がわかりません。最後に symput が呼び出されて実際に実行されたか何かだと思っていましたが、コードを次のように調整すると:

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar'||strip(value),"&stringvar" || strip(value));
  end;
Run;

それから私はそれらすべてを取得します:

GLOBAL STRINGVARONE  One
GLOBAL STRINGVARTWO  Two
GLOBAL STRINGVARFOUR  Four

したがって、私の最後の推測では、データステップを通過すると、「call symput ...」行が実際にマクロプロセッサーに追加され、「&stringvar」が既に置き換えられており、最後のステートメントの後にのみ、それらがすべて実行されます。
これは良い仮定ですか、それとも別の説明がありますか? 元の質問に戻ります:これを達成する簡単な方法はありますか(目的の変数を持つ)?

4

2 に答える 2

5

以下は、RunSubmit.com での同じ質問に対する私の回答です。あなたと@Fabioはソリューションを過剰に設計している可能性があると思います.反復データステップコードはまったく必要ありません...

まず、やろうとしていることを実行する簡単な方法は次のとおりです。

proc sql;
  select Value into :StringVar separated by ''
    from work.test
    where AddToStringYN='Y'
    ;
quit;

ここでは、構文を使用して、SAS/MACRO との SQL インターフェイスを利用できselect intoます。order by探している特定の順序を取得する句を追加することもできます。

第 2 に、SAS マクロの動作について何かに遭遇し、それを理解したいと思っているためです。最初の例では、コードを実行する前にコンパイラが最初に行うことは、&stringvarその時点での値を解決することです。空です。したがって、コンパイル後、このトークンを置き換えると、コードは SAS には次のように見えます...

%let stringvar=;
Data _null_;
  set work.test;
  if AddToStringYN = "Y" then do;
    call symput('stringvar',"" || strip(value));
  end;
Run;

...その後、SAS は先に進み、そのコードを実行します (これはたまたま有効なコードですが、空の文字列を何かの先頭に連結しています)。また、データ ステップの動作方法により、データ ステップの各反復は、実際には の値を置き換えますStringVar。これが、データ ステップの最後に、読み込まれた最後の値が残る理由です。

于 2011-04-29T15:09:06.667 に答える
2

ご挨拶 とても簡単そうですが、私の解決策は次のとおりです。

data a;
set test end=eof;
length cat $100.;
retain cat;
if AddToStringYN = "Y" then do;
   cat=trim(left(cat))||trim(left(value));
end;
if eof then do;
   call symput("VAR",cat);
   output;
end;
run;

%put VAR=&VAR;

この例では、列「CAT」の A データセットに変数の連結があり、同じリストを持つマクロ変数 VAR があります。

于 2011-04-29T10:45:06.270 に答える