Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops SAS循环宏变量解析不正确_Loops_Macros_Sas - Fatal编程技术网

Loops SAS循环宏变量解析不正确

Loops SAS循环宏变量解析不正确,loops,macros,sas,Loops,Macros,Sas,下午好 我正在编写一个SAS程序,该程序将循环处理多组时间序列/观测值。对于每组,每月进行一次观察,总共大约450次观察/月。为了简单起见,月份从1开始并按顺序移动 现在,对于每一组观察,我有一组额外的变量要使用。我正在导入包含所有集合的这些变量的辅助数据集,并使用&&var&I。结构为每个观察变量分配一个唯一的宏变量,以便在主循环执行期间调用。例如,第一个观测值中的所有变量的变量名上都有一个“1”,第二个观测值的变量名为“2”,依此类推。当主循环经过第一次迭代并调用&&var&i时,它将解析为

下午好

我正在编写一个SAS程序,该程序将循环处理多组时间序列/观测值。对于每组,每月进行一次观察,总共大约450次观察/月。为了简单起见,月份从1开始并按顺序移动

现在,对于每一组观察,我有一组额外的变量要使用。我正在导入包含所有集合的这些变量的辅助数据集,并使用&&var&I。结构为每个观察变量分配一个唯一的宏变量,以便在主循环执行期间调用。例如,第一个观测值中的所有变量的变量名上都有一个“1”,第二个观测值的变量名为“2”,依此类推。当主循环经过第一次迭代并调用&&var&i时,它将解析为&var1,并从辅助数据集中的第一次观察中提取指定的值。我已经测试过了,它运行良好

重要提示:辅助集合中的每个观测值都有一系列变量,称为比率_1、比率_2。。。比例高达9。通过上面的宏赋值后,它们将假定宏名称为ratio_11、ratio_21。。。对于第一组,比率为12,比率为22,。。。对于后续集合,依此类推

当我试图插入只在每个集合中的特定时间间隔出现的代码时,问题就出现了。每个集合都有一个变量initial_check,用于确定代码应该在哪个月开始执行。然后,应以12个月为增量对每次观察执行此代码。因此,例如,集合1的初始_检查值可能为36,这意味着代码将仅在第35个月执行观察(请参见下面的代码),随后在第47、59、71个月执行,依此类推

第一行代码旨在确定后续代码仅在上述时间间隔执行(rem_var检查当前月份与初始_检查之间的差额是否超过12-如果没有剩余,则超过12个月的倍数):

同样,我使用非宏语言(即,将值赋给正则变量j)对此进行了测试,这似乎也起到了作用。不幸的是,即使启用了“mprint”选项,我也看不出宏变量是否被正确分配。接下来,我有了额外的代码,只有在满足第一个条件时才应该执行这些代码

if &&ratio_&j&k ne 0 then do ;
问题是:我注意到宏变量j没有解析。 这段代码只应该在定义了&j的实例中执行,所以我不明白为什么它没有被解析。对于更广泛计划的第一个循环,&&ratio&j&k应该在第35个月解析为&ratio_11,在第47个月解析为&ratio_21,依此类推

我尝试过使用条件逻辑的宏版本(%IF,%THEN,%DO),但到目前为止没有得到我想要的结果


会有人有什么见解吗?我束手无策。我将遵循这个线程,所以我可以添加必要的细节。提前感谢您抽出时间阅读此文章。

我们需要更多信息。不能在同一数据步骤中包含最后两段代码,因为数据步骤将使用编译数据步骤时存在的宏变量J的值,而不是调用symput()函数生成的值

为什么J不只是一个数据步长变量

如果它是一个宏变量,并且希望使用调用创建的symput()的值,则需要使用symget()(或symgetn())在运行时检索它。然后可以使用其值生成实际要引用的宏变量的名称

if symgetn(cats('ratio_',symgetn('j'),"&k")) ne 0 then do ;

你的
如果和比率为0,那么就做语句与创建&j的调用symput在同一数据步骤中?如果是这样,它将不起作用,因为&j将在数据步骤编译时,在宏变量创建之前尝试解析。事实上,它是。“&&R&j&k”行直接跟随“end”行。您是否建议开始一个不同的数据步骤?查看一个小的示例数据步骤(可能基于
sashelp.class
)会很有帮助,以准确了解您在这里所做的全部工作。我怀疑您对数据步与宏代码存在误解,并且存在计时问题,但很难区分这里和那里的代码位。这个例子应该是我可以在我的机器上运行的东西,不依赖于你的数据,也不需要像上面那样的一堆行,只要两三行就可以了,如果条件允许的话。如果你正在组合数据集,为什么你要用宏变量而不是常规数据集变量?@Tom我会告诉你(使用控制数据集)第节)用于解释辅助数据集发生的情况。
if &&ratio_&j&k ne 0 then do ;
if symgetn(cats('ratio_',symgetn('j'),"&k")) ne 0 then do ;