考虑我有两个数据集:
data result;
merge dataset_1 (in = a) and dataset_2 (in = b);
by CASENO;
if a and b;
RUN;
我正在寻找两个列表中出现的CASENO数量:在上面的示例中,我会得到2个。
我的数据非常庞大。通过使用合并来获得这种结果需要很长时间。
str.replace()
我正在寻找一种更有效的方式 -
编辑:为清楚起见,有没有办法在没有SAS写出结果文件的情况下返回两个数据集中的匹配数?
答案 0 :(得分:2)
如果数据集已经排序,则数据步合并非常有效。它只传递一次每个表中的每一行。当然,如果您只想要 count ,则无需将所有行输出到数据集,您可以:
data _null_;
merge dataset_1 (in = a keep=caseno) dataset_2 (in = b keep=caseno) end=eof;
by CASENO;
if a and b then count+1;
if eof then call symputx('count',count);
RUN;
由于你没有写出任何东西,因此运行速度会快得多。我还将KEEP语句(正如Tom在注释中指出的那样)添加到传入的数据集中,只读取by变量,这会产生大约10%的加速。
如果数据集是索引,那么您可以更快地进行索引扫描(例如使用SQL)。但是,已排序的非索引表,很难改进数据步骤合并。
答案 1 :(得分:1)
尝试:
proc sql;
select count(caseno) as Number from dataset_1 where caseno in (select caseno from dataset_2);
quit;