SAS - 出现在两个数据集中的记录数(大数据)

时间:2018-03-21 14:35:59

标签: sas

考虑我有两个数据集:

data result;
    merge dataset_1 (in = a) and dataset_2 (in = b);
    by CASENO;
    if a and b;
RUN;

我正在寻找两个列表中出现的CASENO数量:在上面的示例中,我会得到2个。

我的数据非常庞大。通过使用合并来获得这种结果需要很长时间。

str.replace()

我正在寻找一种更有效的方式 -

编辑:为清楚起见,有没有办法在没有SAS写出结果文件的情况下返回两个数据集中的匹配数?

2 个答案:

答案 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;