用于 !! SAS中的通话Symput中

时间:2018-10-04 15:51:34

标签: loops sas strip do-loops sas-studio

谁能告诉我这个数据步骤在做什么?我从未见过使用“ !!”还是之前的“双感叹号”?

data _null_;
set &dset_in.;
if i = _n_ then do i=1 to nvar;
    call symput ("var" !! strip(put(_n_, 3.)), strip(Variabile));
    call symput ("min" !! strip(put(_n_, 3.)), strip(lim_inf));
    call symput ("max" !! strip(put(_n_, 3.)), strip(lim_sup));
end;
run;

循环的要点也将有所帮助,谢谢

3 个答案:

答案 0 :(得分:3)

!根据文档是串联运算符:

https://documentation.sas.com/?docsetId=lrcon&docsetVersion=9.4&docsetTarget=p00iah2thp63bmn1lt20esag14lh.htm&locale=en

代码正在创建一组宏变量VAR001,MIN001 MAX001,以将值存储在数据集中。通常,这是一个不好的做法,如果您需要这样做,通常可以采用一种更简单的方法。

答案 1 :(得分:1)

它仅用于串联(代表||)。

答案 2 :(得分:1)

回答问题的第二部分,它在做什么:

有一个变量i,该变量具有一些值,该值指示用户要从中检索值的行。到达该行时,三个变量中的值将存储在名称中具有行号的宏变量中(例如,如果i = 5,则它将占据第5行,并将这三个变量放在{{1}中) },&var005&min005

但是,此代码存在许多问题。首先,在该循环中重用&max005是一个坏主意;虽然它不会永久地做任​​何事情,但可以轻松地进行其他功能/错误修复引起的细微变化。

第二,当前构造的循环毫无意义。它没有基于i进行任何操作,因此只是将相同的3个值多次放入相同的3个宏变量中。在我看来,这是某人接受从互联网复制的代码,但被误解了。

应该应该做的事情是这样的:

i

这将使用自动数据步骤循环为名称中具有行号的每一行创建宏变量。不过,这只是一个猜测,除了我在这里看到的内容之外,对该程序一无所知。

但要注意的是,整个操作不是一个好主意。将数据值存储在宏变量中是不好的编程习惯。不要这样做。