在数据步SAS呼叫symput

问题描述 投票:0回答:3

我现在面临与SAS数据步这个问题。我的要求是得到的变量,如清单

total_jun2018 = sum(jun2018, dep_jun2018);
total_jul2018 = sum(jul2018, dep_jul2018);

Data final4;
set final3;
by hh_no;

do i=0 to &tot_bal_mnth.;
  bal_mnth =  put(intnx('month',"&min_Completed_dt."d, i-1), monyy7.);
  call symputx('bal_mnth', bal_mnth);
  &bal_mnth._total=sum(&bal_mnth., Dep_&bal_mnth.);
  output;
end;

但我面对错误宏变量bal_mnth没有解决。此外,一旦没有成功运行,但我想要的输出必须按顺序打印,但只打印输出的最后一个循环时i=6则只会打印Total_DEC2018=sum(DEC2018, DEP_DEC2018);

任何帮助将不胜感激!

谢谢,阿贾伊

sas
3个回答
1
投票

这是一个常见的问题,学习SAS宏时。问题是,宏观处理器需要在数据步骤是先提交执行解决&bal_mnth的值,但CALL SYMPUT不执行,直到数据步骤是实际执行,所以在一次提交的代码,有没有可用的&bal_mnth值。

在这种情况下,你不需要bal_mnth被作为数据集中的变量创建的,所以你可以替换成一个bal_mnth = put(intck(...))语句启动%let bal_mnth = ...行。该%let而数据步骤提交,这样的方式,当你需要它的价值将可用来执行。

我的建议%let声明将需要包装的至少一个SYSFUNC调用,就留给读者做练习的功能:-)


1
投票

它看起来像要产生一系列的赋值语句一样的:

total_jun2018 = sum(jun2018, dep_jun2018); 
total_jul2018 = sum(jul2018, dep_jul2018);
...
total_jan2019 = sum(jan2019, dep_jan2019);

所谓的墙纸代码。

如果您的变量的名称比较容易,比如dep1dep18那么这将是易于使用的阵列来处理数据。根据您当前的命名约定与产生阵列语句的问题并不比产生一系列赋值语句的问题太大的不同。

您可以创建一个宏,使您可以使用%DO循环来生成你的壁纸的代码。

%local i bal_mnth;
%do i=0 %to &tot_bal_mnth.;
  %let bal_mnth =  %sysfunc(intnx(month,"&min_Completed_dt."d, &i-1), monyy7.);
  total_&bal_mnth = sum(&bal_mnth , Dep_&bal_mnth );
%end;

或者你可以只生成的代码与数据步的文件。

%let tot_bal_mnth = 7;
%let min_Completed_dt=01JUN2018;
filename code temp;
data _null_;
  file code;
  length bal_mnth $7 ;
  do i=0 to &tot_bal_mnth.;
    bal_mnth =  put(intnx('month',"&min_Completed_dt."d, i-1), monyy7.);
    put 'total_'  bal_mnth $7. ' = sum(' bal_mnth $7. ', Dep_' bal_mnth $7. ');';
  end;
run;

所以,代码生成的文件看起来是这样的:

total_MAY2018 = sum(MAY2018, Dep_MAY2018);
total_JUN2018 = sum(JUN2018, Dep_JUN2018);
total_JUL2018 = sum(JUL2018, Dep_JUL2018);
total_AUG2018 = sum(AUG2018, Dep_AUG2018);
total_SEP2018 = sum(SEP2018, Dep_SEP2018);
total_OCT2018 = sum(OCT2018, Dep_OCT2018);
total_NOV2018 = sum(NOV2018, Dep_NOV2018);
total_DEC2018 = sum(DEC2018, Dep_DEC2018);

然后,可以使用%include在你的数据步骤运行它。

data final4;
  set final3;
  by hh_no;
  %include code / source2 ;
run;

0
投票

我想提出另一种观点:你有这里的困难来自于使用面广的数据形状的结果,有很多列。

而不是在这种形状数据的工作,你可以首先从转宽长,使而不是有很多total_xxx列的,你只需要3:totaltotal_depdate,每月一行。一旦它在这种格式,这将是更容易的工作,可能使你避免诉诸宏和墙纸代码。

推荐阅读:

Transpose wide to long with dynamic variables

© www.soinside.com 2019 - 2024. All rights reserved.