質問

データステップを通過しながら、データセットの特定の値を含む文字列変数を作成する方法を探しています。

例データセットwork.test:

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

したがって、最終的には、変数は次のように見えます:onetwofour(またはさらに良い4つのwoone)。これはとてもシンプルに見えますが、私はそれをする方法を見つけることができないようです。また、このようなマクロ変数を使用しようとしました。

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

しかし、これは次のとおりです。

GLOBAL STRINGVAR Four

だから私は最後の値しか得られません。これは、このマクロ施設についての私の誤解のためであるに違いないと思いますが、なぜ変数に最後の値しかない理由がわかりません。私はそれが実際に実行されたか何かと呼ばれたのは最後だと思ったが、それからコードを調整するとき:

%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

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

役に立ちましたか?

解決

挨拶は十分に単純に思えます、ここに私の解決策があります:

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データセットに変数の連結があり、同じリストのMacroVariable VARがあります

他のヒント

以下は私の答えです runsubmit.comでのあなたの同一の質問. 。あなたと@fabioはソリューションを過剰にエンジニアリングしているかもしれないと思います、それは反復データステップコードをまったく必要としません...

まず、あなたがやろうとしていることをやろうとする簡単な方法は次のようです。

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

ここでは、SAS/マクロを使用してSQLインターフェイスを利用できます。 select into 構文。追加することもできます order by あなたが探している特定の注文を取得するための条項。

第二に、あなたはSASマクロの仕組みについて何かをしていて、あなたはそれを理解したいと思っているので、あなたの最初の例では、あなたのコードを実行する前にコンパイラが最初に行うことは、の値を解決することです &stringvar, 、その時点では空です。したがって、コンピレーションの後、このトークンが交換された状態で、あなたのコードはSASにこのように見えます...

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

...その後、SASが先に進み、そのコードを実行します(これはたまたま有効なコードですが、空の文字列を何かの開始まで連結しています)。そして、データステップの仕組みにより、データステップの各反復は実際にの値を置き換えています StringVar, 、そのため、データステップの最後に、読み取られた最後の値が残されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top