Sql SAS-编写包含Do循环的if语句
我正试图帮助一位同事使用她正在使用的SAS脚本。我是一名程序员,所以我理解逻辑,但是我现在不知道SAS中的语法。基本上这就是她想要做的 我们有:Sql SAS-编写包含Do循环的if语句,sql,sas,Sql,Sas,我正试图帮助一位同事使用她正在使用的SAS脚本。我是一名程序员,所以我理解逻辑,但是我现在不知道SAS中的语法。基本上这就是她想要做的 我们有: Array of Procedure Dates (proc_date[i]) Array of Procedures (proc[i]). 我们数据中的每条记录最多可以有20个过程和20个日期 i=20 每个过程都有一个相关的代码,比如说有100个不同的代码,其中代码1到10是过程A,11到20是过程B等等 我们需要循环遍历每个过程,如果它属于
Array of Procedure Dates (proc_date[i])
Array of Procedures (proc[i]).
我们数据中的每条记录最多可以有20个过程和20个日期
i=20
每个过程都有一个相关的代码,比如说有100个不同的代码,其中代码1到10是过程A,11到20是过程B等等
我们需要循环遍历每个过程,如果它属于100个代码中的一个,则为其分配正确的过程类别(即:它输入一个if语句)。如果这是真的,那么我们需要循环遍历该行中彼此对应的过程日期,如果在我们将“加权值”相加时它们是不同的日期,否则我们将只取2个值中的较大值
我希望这有帮助,我希望这是有意义的。我可以用另一种语言(即:C/C++/C#/VB)来写这篇文章,但是我对SAS感到困惑,因为我对语法不太熟悉,而且逻辑似乎与其他OO语言不同
提前感谢您的帮助。
亲切问候。不管怎样,你都不想做100个
if
语句
问题核心的答案是,您需要if语句之外的do
循环
data want;
set have;
array proc[20];
array proc_date[20];
do _i = 1 to dim(proc); *this would be 20;
if proc[_i] = 53 then ... ;
else if proc[_i] = 54 then ...;
end;
run;
现在,您试图对proc_日期执行的操作听起来像是需要在同一循环中对proc_日期[i]
执行一些操作。循环只是一个迭代器-唯一改变的是用作数组索引的\u i
。欢迎将其作为任意一个数组的数组索引(或执行任何其他操作)。这就是它不同于普通OOP实践的地方,因为它不是数组类;您没有使用单个对象来迭代它。这是一种函数式语言风格(甚至c也会采用同样的方式)
但是,if/else
位将很难处理且很长。在SAS中,你有很多方法来处理这个问题。您可能有另一个包含100个值的数组proc
可以接受,然后在该do循环中有另一个do循环在该数组上迭代(do\u j=1到100;
)-或者反过来(迭代100,在该循环中迭代20),如果这更有意义(如果您希望一次拥有所有的值)
您还可以使用用户定义的格式,它实际上只是值的一对一映射(start
value->label
value)。将您的100个值映射到它们对应的10个程序,或其他任何程序。然后所有100条if语句都变成
proc_value[_i] = put(proc[_i],PROCFMT.);
然后proc_value[_i]存储过程(或任何东西),然后您可以更简单地计算它
您可能还想查看哈希表;既适用于与上述格式类似的概念,也适用于进行存储。哈希表是编程中常见的想法,您可能已经遇到过,SAS实现它们的方式实际上类似于OOP。如果您试图基于过程值进行某种类型的汇总,则可以在哈希表中轻松完成,并且可能比在If语句中更有效。这里介绍了一些语句 *代码1至10为程序,11至20为程序B
proc format;
value codes 1-10 = 'A'
11-20 = 'B';
Procedure(i) = put(code,codes.);
另一种重新编码范围的方法是使用between语法
if 1 <= value <= 10 then variable = <new-value>;
如果1,我将为您在问题中试图做的事情编写伪代码,以使其更清楚。感谢您的回答,我们将深入研究,看看是否可以利用您的建议来完成这项工作。我只是不知所措,因为我不完全理解SAS中的语法。
if 1 <= value <= 10 then variable = <new-value>;