0

因此,我正在尝试创建新列 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;

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

4

2 回答 2

0

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

%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 来归档你想要的东西。我认为有一个没有宏的解决方案。

于 2013-10-23T09:32:06.080 回答
0

这个问题的根源在于宏变量被解析的时候。简而言之,宏变量被解析,然后数据步骤被运行......所以你的宏变量被解析为(即保持不变)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;
于 2013-10-24T16:08:09.860 回答