SAS Enterprise ガイドでいくつかの変数を連結しようとしています。
私SAS_table
は次のようなものから始めます (空の列plums
と空の観察に注意してくださいpears
:
id farm apples pears cherries plums
1 'Munich' 'Granny' 'Williams' 'RedDelight'
2 'Amsterdam' 'PinkLady' 'Scrumptious
3 'Moscow' 'Braeburn' 'Williams' 'RedDelight'
次に、次のようにグローバル変数を作成します。
%do i = 1 %to 3;
%global farm_&i., apples_&i., pears_&i., cherries_&i., plums_&i.;
%end;
そして、上記のテーブルを次のようにグローバル変数に保存します。
data _NULL_;
set SAS_table;
%do i = 1 %to 3;
if id = &i. then do;
call symput("farm_&i.", farm);
call symput("apples_&i.", apples);
call symput("pears_&i.", pears);
call symput("cherries_&i.", cherries);
call symput("plums_&i.", plums);
end;
%end;
run;
上記のすべてがスムーズに動作するようです。次のステップでは、個々の変数で次の出力を取得したいと考えています (空の値はスキップされるだけであることに注意してください。これらの場合、追加の区切り文字 (" :: ") は設定されません)。
concat_1: Munich :: Granny :: Williams :: RedDelight
concat_2: Amsterdam :: PinkLady :: Scrumptious
concat_3: Moscow :: Braeburn :: Williams :: RedDelight
これを行うには、次のコードを使用します。
data _NULL_;
%do i = 1 %to 3;
call_symput("concat_&i",catx(" :: ", &&farm_&i., &&apples_&i.., &&pears_&i..,
&&cherries_&i.., &&plums_&i..));
%end;
run;
ただし、このコードを実行すると、次のエラーが表示されます。
ERROR 159-185: Null parameters for CATX are invalid.
ここでの私の仮定は、変数の一部が空の値になる可能性があるため、SAS は不満であるということです。しかし、どうすればこれを修正できますか? 私はたくさんのことをいじりましたが、良い答えが見つからないようです。
あなたのマクロ変数はMunich
それらのような値を持つように見えます。したがって、マクロが生成している SAS コードは文字列リテラルを生成する必要"Munich"
があります。そうしないと、SAS はその名前の変数を探します。これは、null 値を文字列リテラルにする引用符がないCATX()
と、隣接する区切り文字での呼び出しになるため、null 値に関するエラーについても説明しています。
data _NULL_;
%do i = 1 %to 3;
call_symput("concat_&i",catx(" :: ", "&&farm_&i.", "&&apples_&i.."
, "&&pears_&i..", "&&cherries_&i..", "&&plums_&i.."))
;
%end;
run;
代わりに、引用符を使用してマクロ変数を生成することもできますが、その形式のマクロ変数としてはあまり役に立ちません。したがって、最後の call symput() ステートメントを変更する代わりに、マクロ変数を作成する以前のステートメントを変更できます。そのステップから不要なマクロ コードを削除することもできます。
data _NULL_;
set SAS_table;
call symput(cats("farm_",id), quote(farm));
call symput(cats("apples_",id), quote(apples));
call symput(cats("pears_",id), quote(pears));
call symput(cats("cherries_",id), quote(cherries));
call symput(cats("plums_",id), quote(plums));
run;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加