让SAS做到这一点最简单的方法是什么?

时间:2016-01-13 22:04:44

标签: sas

我有一个看起来像这样但有许多更多变量对的数据集:

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执行此操作的最简单方法是什么?有没有办法告诉它减去每个其他变量减去它之前的变量而不提及具体的变量名称?

非常感谢!!!!

1 个答案:

答案 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;