SAS-Do循环迭代

SAS-Do循环迭代,sas,Sas,有人能给我详细解释一下这个代码吗??我在代码中有一个注释列表,我对此感到困惑。我是否可以附加csv数据?提前谢谢 data have; infile "&sasforum.\datasets\Returns.csv" firstobs=2 dsd truncover; input DATE :mmddyy10. A B B_changed; format date yymmdd10.; run; data spread; do nb = 1 by 1 until(not missing

有人能给我详细解释一下这个代码吗??我在代码中有一个注释列表,我对此感到困惑。我是否可以附加csv数据?提前谢谢

data have;
infile "&sasforum.\datasets\Returns.csv" firstobs=2 dsd truncover;
input DATE :mmddyy10. A B B_changed;
format date yymmdd10.;
run;

data spread;
do nb = 1 by 1 until(not missing(B));
    set have;
    end;
br = B;
do i = 1 to nb;
    set have; *** I don't get how you can do i = 1 to nb with set have.  There is not variable nb on set have.  The variable nb is readinto the dataset spread;
    if nb > 1 then B_spread = (1+br)**(1/nb) - 1;
    else B_spread = B;
    output;
    end;
drop nb i br;
run;

*****如果我注释掉“drop nb i br”,我会看到nb的空值为2。。我不明白这是怎么做到的,也不可能做到。因为如果我在“br=B”行后面运行代码,并在第一个do循环中放入一个输出语句,我很清楚地看到nb的值为1,B为空值。老实说,这就像在以后的观察中读取第一个do循环,B为br。你能给我解释一下吗。第二个数据集“bunch”似乎遵循与第一个数据集相同的原则类型。。。所以我想,如果我第一次掌握了datasetspread是如何创建的,那么我就会理解bunch是如何创建的

这是一种先进的数据步编程技术,通常称为DoW循环。如果你在lexjansen.com上搜索道琼斯指数,你会发现像这样有用的文章。DoW循环编码并围绕SET语句显式循环。这实际上是一个“双道循环”,因为有两个显式循环

我制作了一些示例数据,并在代码中添加了一些PUT语句:

data have ;
  input B ;
  cards ;
.
.
1
2
.
.
.
3
;

data spread;
  do nb = 1 by 1 until(not missing(B));
    set have;

    put _n_= "top do-loop " (nb B)(=) ;
  end;
  br = B;
  do i = 1 to nb;
    set have;
    if nb > 1 then B_spread = (1+br)**(1/nb) - 1;
    else B_spread = B;
    output;
    put _n_= "bottom do-loop " (nb B br B_spread)(=) ;
  end;
  drop nb i br;
run;
对于该样本数据,在数据步骤(N=1)的第一次迭代中,top do循环将迭代三次,读取HAVE的前三条记录。此时,(notmissing(B))将为真,循环将不会再次迭代。变量NB的值为3。然后,底部循环将迭代3次,因为NB的值为3。它还将读取前三条记录。它将计算B_排列,并输出每条记录

在数据步骤的第二次迭代中,top DO循环将只迭代一次。它将读取第四条记录,B=2。底部循环将迭代一次,读取第四条记录,计算B_排列,然后输出

在数据步骤的第三次迭代中,top DO循环将迭代四次,读取第5到第8条记录。底部循环也将迭代四次,读取第5到第8条记录,计算B_排列,然后输出

在数据步骤的第四次迭代中,该步骤将完成,因为顶部循环中的SET语句将读取文件末尾标记


双道循环的核心概念是,通常您是分组读取数据。通常,组由一个ID标识。在这里,它们由顺序记录定义,直到不丢失为止(B)。top DO循环读取第一组记录,并计算一些值(在本例中,它计算NB,即组中的记录数)。然后,底部DO循环读取第一组记录,并使用在顶部DO循环中计算的值计算一些新值。在这种情况下,底部DO循环使用NB计算B_价差。

这是一种先进的数据步编程技术,通常称为DoW循环。如果你在lexjansen.com上搜索道琼斯指数,你会发现像这样有用的文章。DoW循环编码并围绕SET语句显式循环。这实际上是一个“双道循环”,因为有两个显式循环

我制作了一些示例数据,并在代码中添加了一些PUT语句:

data have ;
  input B ;
  cards ;
.
.
1
2
.
.
.
3
;

data spread;
  do nb = 1 by 1 until(not missing(B));
    set have;

    put _n_= "top do-loop " (nb B)(=) ;
  end;
  br = B;
  do i = 1 to nb;
    set have;
    if nb > 1 then B_spread = (1+br)**(1/nb) - 1;
    else B_spread = B;
    output;
    put _n_= "bottom do-loop " (nb B br B_spread)(=) ;
  end;
  drop nb i br;
run;
对于该样本数据,在数据步骤(N=1)的第一次迭代中,top do循环将迭代三次,读取HAVE的前三条记录。此时,(notmissing(B))将为真,循环将不会再次迭代。变量NB的值为3。然后,底部循环将迭代3次,因为NB的值为3。它还将读取前三条记录。它将计算B_排列,并输出每条记录

在数据步骤的第二次迭代中,top DO循环将只迭代一次。它将读取第四条记录,B=2。底部循环将迭代一次,读取第四条记录,计算B_排列,然后输出

在数据步骤的第三次迭代中,top DO循环将迭代四次,读取第5到第8条记录。底部循环也将迭代四次,读取第5到第8条记录,计算B_排列,然后输出

在数据步骤的第四次迭代中,该步骤将完成,因为顶部循环中的SET语句将读取文件末尾标记


双道循环的核心概念是,通常您是分组读取数据。通常,组由一个ID标识。在这里,它们由顺序记录定义,直到不丢失为止(B)。top DO循环读取第一组记录,并计算一些值(在本例中,它计算NB,即组中的记录数)。然后,底部DO循环读取第一组记录,并使用在顶部DO循环中计算的值计算一些新值。在这种情况下,底部DO循环使用NB计算B_排列。

您不能附加csv。但是,您可以将Returns.csv中的5-10条数据记录发布到您的问题中。那会有帮助的。或者更好的方法是,粘贴一个代码步骤,创建work.have,以及一个cards语句或其他任何东西。下面是一些说明,用于在其他人可以运行的数据步骤中创建示例数据。嘿,伙计们,谢谢你们的帮助,如果我发布其他问题,我会记住这一点。你们不能附加csv。但是,您可以将Returns.csv中的5-10条数据记录发布到您的问题中。那会有帮助的。或者更好的方法是,粘贴一个代码步骤,创建work.have,以及一个cards语句或其他任何东西。下面是一些说明,用于在其他人可以运行的数据步骤中创建示例数据。嘿,伙计们,谢谢你们的帮助,如果我再发一个问题,我会记住这一点。如果我能添加一个后续问题。。当我运行您提供的代码并检查日志时,我得到如下结果:\u N\u=1 top do loop nb=1 B=_N_u1顶部do循环nb=2 B=_N\u1顶部do循环nb=3 B=1\u N\u1底部do循环nb=3 B=。br=1 B_排列=0.2599210499_N_=1底部do循环nb=3 B=。br=1 B_价差=0.2599210499我唯一的问题是,为什么底部循环它