我正在尝试用她正在使用的SAS脚本帮助一位同事。我是程序员,所以我理解逻辑,但我现在不在SAS中的语法。基本上这就是她想要做的事情。
我们有:
Array of Procedure Dates (proc_date[i])
Array of Procedures (proc[i]).
我们数据中的每条记录最多可包含20个程序和20个日期。
i=20
每个程序都有一个相关的代码,我们可以说有100个不同的代码,代码1到10是ProcedureA,11到20是ProcedureB等。
如果它落入100个代码中的1个(即:它进入If语句之一),我们需要循环遍历每个过程并为其分配正确的ProcedureCategory。如果这是真的,那么我们需要在该行中相互循环相应的过程日期,如果它们是我们将“加权值”加在一起的不同日期,否则我们将只取2个值中的较大值。
我希望有所帮助,我希望这是有道理的。我可以用另一种语言写这个(比如:C / C ++ / C#/ VB)但是我对SAS感到很茫然,因为我对语法并不熟悉,逻辑似乎不是那个其他的OO语言。
提前感谢您的任何帮助。 亲切的问候。
答案 0 :(得分:1)
您不希望以某种方式执行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_date做的事情听起来像你需要在同一个循环中对proc_date[i]
做一些事情。循环只是一个迭代器 - 唯一改变的是_i
,它被用作数组索引。欢迎成为任一阵列的数组索引(或做任何其他事情)。这与普通的OOP实践不同,因为它不是数组类;你没有使用单个对象来迭代它。这是一种功能性的语言风格(即使是这样也可以这样做。)
但是,if/else
位会很笨拙而且很长。在SAS中,您有很多方法可以解决这个问题。您可能有另一个包含100个值proc
的数组,然后在该循环中有另一个do循环迭代 数组(do _j = 1 to 100;
) - 或者相反(迭代遍历100,内部迭代20)如果这更有意义(如果你想一次拥有所有值)。
data want;
set have;
array proc[20];
array proc_date[20];
array proc_val[100]; *needs to be populated in the `have` dataset, or in another;
do _i = 1 to dim(proc_val);
do _i = 1 to dim(proc);
if proc[_j] = proc_val[_i] then ...; *this statement executes 100*20 times;
end;
end;
run;
您还可以使用用户定义的格式,这实际上只是值的一对一映射(start
值 - > label
值)。将您的100个值映射到它们对应的10个过程,或者其他任何过程。然后所有100个if语句变为
proc_value[_i] = put(proc[_i],PROCFMT.);
然后proc_value [_i]存储您可以更有希望地评估的过程(或其他)。
您也可能想要查看哈希表;既可以用于与上述格式类似的概念,也可以用于存储。哈希表是编程中的一个常见想法,也许你已经遇到过,SAS实现它们的方式实际上就像OOP一样。如果您尝试根据过程值进行某种类型的汇总,则可以在哈希表中轻松完成,并且可能比在IF语句中更有效。
答案 1 :(得分:1)
以下是一些提及的陈述。
*代码1到10是ProcedureA,11到20是ProcedureB;
proc format;
value codes 1-10 = 'A'
11-20 = 'B';
Procedure(i) = put(code,codes.);
重新编码范围的另一种方法是使用语法
if 1 <= value <= 10 then variable = <new-value>;
HTH