我无法找到起点,因为我对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来说真的很陌生。
答案 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
排序才能使其正常工作。