我有一个看起来像这样但有许多更多变量对的数据集:
Stuff2016 Stuff2008 Earth2016 Earth2008 Fire2016 Fire2008
123456 5646743 45 456 456 890101
541351 543534534 45 489 489 74456
352352 564889 98 489489 1231 189
464646 542235423 13 15615 1561 78
987654 4561889 44 1212 12121 111
对于每对几乎同名的变量, 我希望SAS在不输入变量名的情况下减去2016年数据 - 2008年数据。
在不必专门输入变量名称的情况下,告诉SAS执行此操作的最简单方法是什么?有没有办法告诉它减去每个其他变量减去它之前的变量而不提及具体的变量名称?
非常感谢!!!!
答案 0 :(得分:2)
我可能会推荐三个阵列,但你可以一个。这在很大程度上取决于变量的顺序,这在我的书中并不是一个好的假设。另外,您如何自动命名结果?
data want;
set have;
array vars(*) stuff2016--fire2008;
array diffs(*) diffs1-diffs20; *something big enough to hold difference;
do i=1 to dim(vars)-1;
diffs(i) = vars(i)-vars(i+1);
end;
run;
相反,我强烈建议您使用字典表来查询变量名称并动态生成变量列表,然后将其传递到三个不同的阵列,一个用于2016,一个用于2008,一个用于差异。 libname和memname以大写形式存储在Dictionary表中,因此请记住这一点。
data have;
input Stuff2016 Stuff2008 Earth2016 Earth2008 Fire2016 Fire2008;
cards;
123456 5646743 45 456 456 890101
541351 543534534 45 489 489 74456
352352 564889 98 489489 1231 189
464646 542235423 13 15615 1561 78
987654 4561889 44 1212 12121 111
;
run;
proc sql;
select name into :var2016 separated by " "
from sashelp.vcolumn
where libname='WORK'
and memname='HAVE'
and name like '%2016'
order by name;
select name into :var2008 separated by " "
from sashelp.vcolumn
where libname='WORK'
and memname='HAVE'
and name like '%2008'
order by name;
select catx("_", compress(name, ,'d'), "diff") into :vardiff separated by " "
from sashelp.vcolumn
where libname='WORK'
and memname='HAVE'
and name like '%2016'
order by name;
quit;
%put &var2016.;
%put &var2008.;
%put &vardiff.;
data want;
set have;
array v2016(*) &var2016;
array v2008(*) &var2008;
array diffs(*) &vardiff;
do i=1 to dim(v2016);
diffs(i)=v2016(i)-v2008(i);
end;
run;