SAS-从数据集的每一行创建宏
我有以下数据集:SAS-从数据集的每一行创建宏,sas,Sas,我有以下数据集: Target_attr Target_level ATTR1 CHOCOLATE SBU ATTR1 CHOCOLATE SBU ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY ATTR1|ATTR5 CHOCOLATE SBU|EVERYD
Target_attr Target_level
ATTR1 CHOCOLATE SBU
ATTR1 CHOCOLATE SBU
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EVERYDAY
ATTR1|ATTR5 CHOCOLATE SBU|EASTER
ATTR1|ATTR5 CHOCOLATE SBU|HALLOWEEN
ATTR1|ATTR5 CHOCOLATE SBU|HOLIDAY
ATTR1|ATTR5 CHOCOLATE SBU|VALENTINE
ATTR1|ATTR5 CHOCOLATE SBU|IN/OUT
列的Target_attr值是另一个数据集的变量,列的Target_level是该列中的值。
因此,我要做的是创建一个宏,将数据集子集化,如下所示:
row1: if ATTR1="CHOCOLATE SBU" then ...
row2: if ATTR1="CHOCOLATE SBU" then ...
row3: if ATTR1="CHOCOLATE SBU" and ATTR5="EVERYDAY" then ...
另一个数据集如下所示:
PPGs ATTR1 ATTR2 ATTR3 ATTR4 ATTR5 ATTR6
A/O BRAND EASTER CH BASKET <=4OZ CHOCOLATE SBU A/O MANUFACTURER A/O FRANCHISE TAKE HOME EASTER BASKET <=4OZ
A/O BRAND EASTER BASKET <=4OZ SWEETS SBU A/O MANUFACTURER A/O FRANCHISE TAKE HOME EASTER BASKET <=4OZ
FRANKFORD EASTER BASKET <=4OZ SWEETS SBU FRANKFORD FRANKFORD FR TAKE HOME EASTER BASKET <=4OZ
A/O BRAND EASTER CH BASKET >4.1OZ CHOCOLATE SBU A/O MANUFACTURER A/O FRANCHISE TAKE HOME EASTER BASKET >4.1OZ
A/O BRAND EASTER BASKET >4.1OZ SWEETS SBU A/O MANUFACTURER A/O FRANCHISE TAKE HOME EASTER BASKET >4.1OZ
TIC TAC EVERYDAY BF BOTTLE/POUCH BREATH FRESHENER FERRERO TIC TAC FR INSTANT CONSUMABLE EVERYDAY BF BOTTLE/POUCH
TIC TAC EVERYDAY BF CT BOX CHOCOLATE SBU FERRERO TIC TAC FR INSTANT CONSUMABLE EVERYDAY BF CT BOX
BREATHSAVERS EVERYDAY BF CT BOX CHOCOLATE SBU HERSHEY BREATHSAVERS FR INSTANT CONSUMABLE EVERYDAY BF CT BOX
ICE BREAKERS FR EVERYDAY BF CT BOX BREATH FRESHENER HERSHEY ICE BREAKERS FR INSTANT CONSUMABLE EVERYDAY BF CT BOX
MENTOS EVERYDAY BF CT BOX BREATH FRESHENER PERFETTI VAN MELLE MENTOS FR INSTANT CONSUMABLE EVERYDAY BF CT BOX
我试过一些东西,但不值得分享。。。
能否请您提供帮助?如果无法将其重新设计为联接或格式,则使用数据步骤生成所需代码可能比使用宏变量或宏逻辑生成代码更容易 所以如果你想生成
if ATTR1="CHOCOLATE SBU" then ...
您可以使用put语句,如:
put 'if ' target_attr '=' target_level :$quote. 'then ...';
所以你的整个程序都会遵循这个结构
filename code temp;
data _null_;
set METADATA ;
file code ;
* generate code ;
put 'if ' target_attr ....
...
run;
data want ;
set have ;
%include code /source2 ;
run;
此方法的优点之一是可以查看生成的代码,并确保生成逻辑生成有效的代码。查看和测试纯SAS代码要比查看带有宏变量引用或宏逻辑的代码容易得多。您的问题不清楚。请显示另一个数据集的记录示例,并显示所需的输出。您正在尝试将一个数据集拆分为多个数据集吗?您需要包含您尝试过的内容。而且-这不是正确的数据结构。将其转换为垂直/标准化,然后一个简单的连接将更有效地完成您想要的工作。如果答案是“用大量If语句生成宏”,那么问题几乎不可避免地是错误的。
put 'if ' target_attr '=' target_level :$quote. 'then ...';
filename code temp;
data _null_;
set METADATA ;
file code ;
* generate code ;
put 'if ' target_attr ....
...
run;
data want ;
set have ;
%include code /source2 ;
run;