Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS-从数据集的每一行创建宏_Sas - Fatal编程技术网

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;