SAS Macro从一个变量中提取许多变量

时间:2014-03-27 14:14:34

标签: sas sas-macro

我无法找到起点,因为我对SAS很陌生。

我有一个如下所示的数据集:

customer id number volume
1        ab  10     5
1        cd  7      3
2        xy  15     2
2        ab  3      50

我想创建一个新数据集,其中我需要为每个distint id添加一个新变量。 在id出现的行中,数字和体积应在新变量中相乘。新数据集应如下所示:

customer id number volume ab cd xy
1        ab  10     5     50 .  .
1        cd  7      3     .  21 .
2        xy  15     2     .  .  30
2        ab  3      50    150 . .

有没有人有想法?也许解决方案非常简单,但每一条评论都表示赞赏,因为我对SAS来说真的很陌生。

1 个答案:

答案 0 :(得分:4)

无需使用宏。数组应该为你处理。

data want;
set have;
array flagvars ab cd xy;  *an array of your 3 new variables;
do _i = 1 to dim(flagvars);  *iterate one to the dimension of the array (# of vars in it);
  if upcase(vname(flagvars[_i])) = upcase(id) then flagvars[_i] = number*volume;  *if the name of the variable is identical to the id value, set that member of the array to the desired value;
end;
run;

如果你有很多,你可以用数组变量列表构建一个宏变量:

proc sql;
select distinct id into :idlist separated by ' ' from have;
quit;

然后使用

array flagvars &idlist.;

代替书面清单。

或者,如果您预先创建数字*音量变量,则可以PROC TRANSPOSE。

data have;
input customer id $ number volume;
total = number*volume;
datalines;
1        ab  10     5
1        cd  7      3
2        xy  15     2
2        ab  3      50
;;;;;
run;
proc sort data=have;
by customer id;
run;
proc transpose data=have out=have_t;
by customer id;
copy number volume;
var total;
id id;
run;

ID语句根据参数命名变量(在本例中为id)。 Copy附加转置中未使用的变量。您必须按customer id排序才能使其正常工作。