在if-else语句中排序更有利(高效)吗?

时间:2015-04-16 04:13:41

标签: sas

假设已经定义了两个函数fun1, fun2,在输入x的情况下执行一些计算。

数据have的结构是:

Day      Group  x
01Jul14  A      1.5
02JUl14  B      2.7

我想这样做:

data want;
  set have;
  if Group = 'A' then y = fun1(x);
  if Group = 'B' then y = fun2(x);
run;

首先执行proc sort data=have;by Group;run;然后转到数据步骤会更好吗?或者它没关系,因为每次它只选择一个观察并确定它属于哪个if声明?

1 个答案:

答案 0 :(得分:1)

只要您没有做任何事情来改变观察的正常输入 - 例如使用随机访问(point=),构建哈希表,使用by语句等 - 排序将不会产生任何影响:无论if语句如何,您都会读取每一行,检查两行,执行其中一行。没有什么不同的排序或未排序。

这很容易测试。写下这样的东西:

%put Before Unsorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Unsorted Time: %sysfunc(time(),time8.);

proc sort data=your_dataset;
by x;
run;

%put Before Sorted Time: %sysfunc(time(),time8.);
***your datastep here***;
%put After Sorted Time: %sysfunc(time(),time8.);

或者只是运行你的datasteps并查看执行时间!

您可能会对此排除 if 语句(即更改代码中的顺序)而感到困惑。如果您的数据存在偏差且使用else,则可能会产生影响。这是因为SAS不必进一步评估下游条件。对此产生任何影响并不常见 - 只有当您有极其歪曲的数据,大量观察以及基于您的代码的某些其他条件时才会这么做 - 所以我不会为它

相关问题