是否可以避免在SAS的每个datastep中写入文件?
例如,我在我的HD上开始使用两个名为have1
和have2
的SAS数据集。然后我做了这些简单的SAS数据步骤:
data have3;
merge have1 have2; by id;run;
data have3; set have3;
if id='5' then delete;run;
proc sort data=have3; by id;run;
proc summary data=have3;
by id;
output out=have4
sum(expense)=expense;
run;
我可以在内存中执行前2个数据步骤和proc sort
,然后在HD has4上写入吗? [实际上我使用哈希对象进行合并]。
have3
是一个很大的数据集,所以如果我能避免在每个数据步骤上都能在我的HD上写入数据那么好。
答案 0 :(得分:4)
你的问题的广泛答案是肯定的,你可以避免一些步骤;在某些情况下,您可以使用view
来避免写出数据集。您还可以使用内存库(ramlib
)在内存中而不是在硬盘上定义库。
在您的具体情况下,无论如何,似乎某些处理是不必要的。
data have3;
merge have1 have2; by id;run;
data have3; set have3;
if id='5' then delete;run;
proc sort data=have3; by id;run;
proc summary data=have3;
by id;
output out=have4
sum(expense)=expense;
run;
可能是
data have3;
merge have1 have2;
by id;
if id='5' then delete;
run;
proc summary data=have3;
class id;
output out=have4 sum(expense)=expense;
run;
Class
不需要排序,在这种情况下可以像by
一样有效地工作。没有理由将合并和删除分开(更有效的方法是在传入的数据集上使用where
语句)。
如果您愿意,您甚至可以将have3
定义为视图。
data have3 /view=have3; *other code is the same;
在这种情况下,您不能拥有名为have3
的预先存在的数据集,否则它将失败。
答案 1 :(得分:0)
还有另一种更原始但简单的方法来清理程序生成的各种数据集。 Proc数据集不会阻止创建文件,但您可以使用它来删除任何已失效的数据。此示例将删除has1和have2。
proc datasets;
delete have1 have2;
run;