假设已经定义了两个函数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
声明?
答案 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不必进一步评估下游条件。对此产生任何影响并不常见 - 只有当您有极其歪曲的数据,大量观察以及基于您的代码的某些其他条件时才会这么做 - 所以我不会为它