Loops SAS迭代是如何通过变量和if-else工作的
我遇到了以下代码,它工作安静而不是直觉,因为SAS应该一步一步地处理。然而,下面的代码似乎以某种方式跳回到前面的代码,就像一个循环 请参见重置和重置_p2中标志和页面的区别 生成数据集: 试图理解此代码: 我们把台阶分开 pageit和flag列在reset和reset_p2中不同 重置中的pageit和标志: 重置页面p2中的pageit和标志: 这意味着代码似乎不是一步一步地运行,而是以某种方式跳回到if n eq 1部分。 任何人都能解释为什么会发生这种情况?Loops SAS迭代是如何通过变量和if-else工作的,loops,if-statement,sas,iteration,Loops,If Statement,Sas,Iteration,我遇到了以下代码,它工作安静而不是直觉,因为SAS应该一步一步地处理。然而,下面的代码似乎以某种方式跳回到前面的代码,就像一个循环 请参见重置和重置_p2中标志和页面的区别 生成数据集: 试图理解此代码: 我们把台阶分开 pageit和flag列在reset和reset_p2中不同 重置中的pageit和标志: 重置页面p2中的pageit和标志: 这意味着代码似乎不是一步一步地运行,而是以某种方式跳回到if n eq 1部分。 任何人都能解释为什么会发生这种情况? 因为这真的不是直觉的 解释:
因为这真的不是直觉的 解释:变量_N_________________________________。您有100行,因此无论发生什么,它都将处理100个步骤。在您的代码中,您不断增加标志,但每次达到25时,都将其重置为0;而且,当它达到25时,你可以增加它。和这正是您的输出的样子,因此我不确定您的困惑是什么。说明:变量逐行遍历每行数据。您有100行,因此无论发生什么,它都将处理100个步骤。在您的代码中,您不断增加标志,但每次达到25时,都将其重置为0;而且,当它达到25时,你可以增加它。和这正是您的输出看起来的样子,因此我不确定您的困惑是什么。如果您按照以下方式修改“重置”代码
data reset;
set new;
by type;
if _n_ eq 1 then flag=0;
else flag+1;
if flag>=25 then do;
pageit+1;
flag1=0;
end;
run;
如果您按以下方式修改“重置”代码,则可能会得到当标志>=25时的分辨率
data reset;
set new;
by type;
if _n_ eq 1 then flag=0;
else flag+1;
if flag>=25 then do;
pageit+1;
flag1=0;
end;
run;
当flag>=25时,您可能会得到解析结果。原始数据步骤正在生成输入数据集中不存在的新flag变量。因为您使用的是sum语句,所以当隐式数据步循环重新启动时,变量的值将被保留,而不是重置为丢失 但是在第二个数据步骤中,输入数据集中已经存在FLAG变量。因此,当从输入数据集读取观测值时,其值将被覆盖。因此,一旦超过观测值25,则标志>=25条件始终为真,因此标志将从25、26、27等重置为0 使用RETAIN时,请确保使用的是未从输入数据集读入的新变量 如果您已经有一个值为0,1,2,…24,25,26,…的标志变量,。。。你想把它分成25个值的箱子,然后用算术运算
new_flag = mod(flag,25);
new_page = int(flag/25);
原始数据步骤是生成输入数据集中不存在的新标志变量。因为您使用的是sum语句,所以当隐式数据步循环重新启动时,变量的值将被保留,而不是重置为丢失 但是在第二个数据步骤中,输入数据集中已经存在FLAG变量。因此,当从输入数据集读取观测值时,其值将被覆盖。因此,一旦超过观测值25,则标志>=25条件始终为真,因此标志将从25、26、27等重置为0 使用RETAIN时,请确保使用的是未从输入数据集读入的新变量 如果您已经有一个值为0,1,2,…24,25,26,…的标志变量,。。。你想把它分成25个值的箱子,然后用算术运算
new_flag = mod(flag,25);
new_page = int(flag/25);
我看到隐藏的机制是,当我们使用求和时,值被保留。这完全解释了这段代码。谢谢。我看到隐藏的机制是,当我们使用总和时,值被保留。这完全解释了这段代码。谢谢
new_flag = mod(flag,25);
new_page = int(flag/25);