我目前正在SAS中运行宏代码,我想对max和min进行计算。现在我的代码行是:
hhincscaled = 100*(hhinc - min(hhinc) )/ (max(hhinc) - min(hhinc));
hhvaluescaled = 100*(hhvalue - min(hhvalue))/ (max(hhvalue) - min(hhvalue));
我想做的是通过下面的计算重新调整家庭收入和价值变量。我试图减去每个变量的最小值并从相应的最大值中减去它,然后将其乘以100进行缩放。我不确定这是否正确,或者SAS是否正在识别代码我希望它的方式。
答案 0 :(得分:2)
我假设您正处于数据步骤中。数据步骤对数据集中的记录具有隐式循环。您只能访问当前循环的记录(有一些例外)。
" SAS"这样做的方法是计算最小值和最大值,然后将它们添加到数据集中。Proc sql noprint;
create table want as
select *,
min(hhinc) as min_hhinc,
max(hhinc) as max_hhinc,
min(hhvalue) as min_hhvalue,
max(hhvalue) as max_hhvalue
from have;
quit;
data want;
set want;
hhincscaled = 100*(hhinc - min_hhinc )/ (max_hhinc - min_hhinc);
hhvaluescaled = 100*(hhvalue - min_hhvalue)/ (max_hhvalue - min_hhvalue);
/*Delete this if you want to keep the min max*/
drop min_: max_:;
run;
答案 1 :(得分:1)
另一种SAS方法是使用PROC MEANS
(或PROC SUMMARY
或您选择的替代方法)创建最大/最小表并将其合并。不需要SQL知识,也可能需要相同的速度。
proc means data=have;
*use a class value if you have one;
var hhinc hhvalue;
output out=minmax min= max= /autoname;
run;
data want;
if _n_=1 then set minmax; *get the min/max values- they will be retained automatically and available on every row;
set have;
*do your calculations, using the new variables hhinc_max hhinc_min etc.;
run;
如果你有一个课堂陈述 - 即一个像州一样的分组'或者类似的 - 在proc means
中添加,然后在您的类变量中merge
代替want
中的第二个集合。它需要一个排序的(初始)数据集来合并。
您还可以选择在SAS-IML
中执行此操作,这与您上面的思考方式更为相似。 IML是SAS交互式矩阵语言,与SAS基本语言更相似r
或matlab
。