【问题标题】:SAS create new dataset variable using macroSAS使用宏创建新的数据集变量
【发布时间】:2013-10-23 00:20:29
【问题描述】:

所以我正在尝试创建新列 mon_&cur_buy 和 times_&cur_buy,它们分别保存从 work.t 表中设置为值 money 和 times 的值。

为新变量分配值的标准是 &cur_buy 宏变量的名称是否与 work.t 表中 BuyName 的当前行值匹配。

引用的 &buyers 宏变量只是一个用逗号分隔的名称列表。

我说新变量 mon_&cur_buy 和 times_&cur_buy 无效的错误。

名称已正确解析,但从未写入新数据集 decvars。

%let names = %quote(&buyers);
%let count = %sysfunc(countw(&buyers));
data decvars;
    set work.t;
    i=1;
    do while (i <= &count);
    %let cur_buy = %qscan(&names,&i,%str(,));
        length mon_&cur_buy 8;
        length times_&cur_buy 8; 
        if BuyName = "&cur_buy" then do; 
            mon_&cur_buy = money; /*still getting that statement is invalid        here*/
            times_&cur_buy = times;
        end;
    i=i+1;
    end;
run;

最终,我尝试为每个买家的购买创建单独的列,以进行回归分析,其中仅包含某个买家的购买价值。如果您对如何使用宏变量自动执行此类过程有任何建议,请告诉我。

【问题讨论】:

  • 如果您提供了示例数据,您可能会获得其他解决方案。

标签: macros sas


【解决方案1】:

我不确定你希望你的输出是什么样子,而且在我看来,你尝试的结果不会返回你所期望的。如果您希望您的宏变量及时解析,您需要将数据步骤放入宏中。跟宏的编译执行顺序有关。

%macro mDecVars;

 data decvars;
  set work.t;
  %do i =1 %to &count;
   %let cur_buy =  %qscan(&names,&i,%str(,));
   length mon_&cur_buy 8;
   length times_&cur_buy 8; 
   if BuyName = "&cur_buy" then do; 
    mon_&cur_buy = money; 
    times_&cur_buy = times;
   end;
  %end;
  run;

%mend;
%mDecVars;

但是你可能想玩转 proc transpose 来归档你想要的东西。我想有一个没有宏的解决方案。

【讨论】:

    【解决方案2】:

    这个问题的根源在于宏变量被解析的时候。简而言之,解析宏变量,然后运行数据步骤......因此您的宏变量被解析为(即保持不变)mon_&cur_buy 和 times_&cur_buy。

    这个流程图很有用:http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a001072110.htm

    参考流程图,您的问题代码是“开放代码”,即它不在像 Laurent de Walick 的回答这样的宏中。

    比方说,就像在 Lauren De Walicks 解决方案中一样(开放代码除外),您运行:

    %let names=name1,name2;
    %let count=2;
    data decvars;
        set work.t;
        %do i = 1 %to &count;
        %let cur_buy = %qscan(&names,&i,%str(,));
            length mon_&cur_buy 8;
            length times_&cur_buy 8; 
            if BuyName = "&cur_buy" then do; 
                mon_&cur_buy = money;
                times_&cur_buy = times;
            end;
        %end;
    run;
    

    SAS 会做的是生成这个数据步骤,然后运行它:

    data decvars;
        set work.t;
            length mon_name1 8;
            length times_name1 8; 
            if BuyName = "name1" then do; 
                mon_name1 = money;
                times_name1 = times;
            end;
            length mon_name2 8;
            length times_name2 8; 
            if BuyName = "name2" then do; 
                mon_name2 = money;
                times_name2 = times;
            end;
    run;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多