【问题标题】:SAS %let statement to equal a called upon value from a table?SAS %let 语句等于表中调用的值?
【发布时间】:2013-06-28 18:02:55
【问题描述】:

是否可以将%let 语句分配为等于表中调用的值?我知道我可以使用以下代码循环执行此操作。

proc sql noprint;
    select NameID into :Name separated by " "
    from Registration;
quit;

proc sql noprint;
    select count (*) into :NumNAME
    from Registration;
quit;

有没有办法在循环之外完成它,或者只需一步,通过创建一些%let Name = 来直接调用表?我意识到这和以前的question 相似,只是我比较挑剔。

【问题讨论】:

  • 你在问/说什么没有任何意义。这里没有循环,只是您需要使用循环来访问那里的数据。你到底想做什么?无论如何,您所描述的具体事物都不是一个好主意,因此了解最终结果可能会有所帮助。
  • 我创建了一个表格来查找附加到名称的数字。我想将找到的数字设置为变量,而无需手动将其设置为该数字。我不知道是否有一种方法可以将 let 语句设置为进入表并使用该数字,而无需将数字输入为该变量,或者 let 语句是否可以搜索表。
  • 这不是我想知道的。你想整体做什么?您通常不应该以听起来像是在尝试的方式使用变量 - SAS 不是一种具有全局变量或类似内容的编程语言,数据应该存储在数据集中,而不是宏变量中。

标签: sas


【解决方案1】:

%Let 语句对于这类事情不是很灵活。

但是,CALL SYMPUT 可以在数据步的中间使用来设置宏变量,并且可能会有更多帮助。

怎么样:

data myReg;
INPUT Name $;
DATALINES;
Alex
Alex
Ben
Ben
Ben
Calvin
Calvin
Calvin
Calvin
;
run;

proc sort data=myReg; by name;run;
data MakeSomeMacroVars;
        set myReg end=LastRow;
        by name;

        length Allnames $30000;*Variable for space separated list of names;
        retain AllNames ' ';

        cnt+1;
        if last.name THEN DO;
                *Create a macro variable NUM_Alex or similar, with value equal to cnt;
                CALL SYMPUT (cats('NUM_',name),cats((put(cnt,12.))));
                cnt=0;
                *Add name to space separated list;
                Allnames = catx(" ",AllNames, name);
        END;

        if LastRow THen do;
                Call Symput ('AllNames',cats(compbl(AllNames)));
        END;
RUN;
%Put Alex has --&NUM_Alex--; * --> 2;
%Put Ben has --&NUM_Ben--; * --> 3;
%Put List of names is: --&AllNames--; * --> Alex Ben Calvin;

【讨论】:

  • 我想这是最接近我正在寻找的东西。我认为这比我希望的要复杂一些,但知道它可以完成就足够了!
  • 酷 - 我仍然建议考虑一下上面 Joe 的 cmets,以解决针对您的特定情况的可能/应该问题。编写能够吸引语言优势的代码总是最好的。对于 SAS,与大多数成熟的编程语言 IMO 相比,处理变量是相当原始的。
  • 为了完整起见,还要注意select into:proc sql 等效于call symput()
猜你喜欢
  • 2012-06-20
  • 2018-03-25
  • 1970-01-01
  • 2018-08-30
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2017-06-04
相关资源
最近更新 更多