我以前很少使用proc freq。我试图运行以下内容并收到错误消息称SAS无法分配足够的内存。该数据集有大约15,000条记录。这里有什么替代方案?
proc freq data=dsb_un noprint;
table bsn*dsb / out=dsb_un2(where=(count>1) drop=percent);
run;
答案 0 :(得分:0)
由于您的百分比下降,以下内容应该相同:
proc freq data=dsb_un noprint;
by bsn;
tables dsb/out=dsb_un2(where=(count>1) drop=percent);
run;
BY语句应该显着减少内存分配。您也可以以类似的方式使用PROC SQL,这可能非常适合内存。
问题很可能是DSB和BSN各自都是唯一的值,所以你可能每个都有10k +值 - 制作10k * 10k或1e8单元的主表,需要8e8字节的内存,这可能超出你可用的SAS内存。
答案 1 :(得分:0)
我之前也打过这个。我绕过它的方式就是不使用proc freq
。我相信我使用的是proc summary
。它也可以计算频率。
首先是一个测试数据集:
data tmp;
set sashelp.class;
dummy = 1;
run;
使用原始freq
方法:
proc freq data=tmp noprint;
table sex*age / out=freq1(where=(count>1) drop=percent);
run;
使用proc summary
方法:
proc summary data=tmp noprint nway missing;
class sex age;
var dummy;
output out=freq2(where=(dummy>1) drop=_type_ _freq_) sum=;
run;
请注意,proc summary
可能需要一个可以计算的虚拟变量。因此,在我的测试数据集中创建了dummy=1
标志。