过滤 SAS 数据集以仅包含列表中给定的标识符

Filter a SAS dataset to contain only identifiers given in a list

我在 SAS Enterprise guide 工作,并且有一个包含唯一标识符 (id_list) 的单列 SAS table。

我想过滤另一个 SAS table 以仅包含可以在 id_list 中找到的观察结果。

到目前为止我的代码是:

proc sql noprint;
    CREATE TABLE test AS
    SELECT *
    FROM  data_sample
    WHERE id IN id_list
quit;

此代码出现以下错误:

Error 22-322: Syntax error, expecting on of the following: (, SELECT.

我做错了什么?

在此先感谢您的帮助。

您可以在 proc sql 中使用联接,但在带有 in= 语句的数据步骤中使用合并可能更简单。

data want;
  merge oneColData(in = A) otherData(in = B);
  by id_list;

  if A;

run;

您将两个数据集合并在一起,然后使用 if A 您只获取出现在单列数据集中的 ID。为此,您必须合并 id_list,它必须在两个数据集中,并且两个数据集必须按 id_list.

排序

您不能只给它起 table 名称。您需要创建一个子查询,其中包含您希望它从 ID_LIST.

中读取的变量
CREATE TABLE test AS
  SELECT *
  FROM data_sample
  WHERE id IN (select id from id_list)
;

使用数据步而不是 PROC 的问题 SQL 是对于数据步,数据集必须根据用于合并的变量进行排序。如果还不是这种情况,则必须首先对完整的数据集进行排序。

如果我有一个非常大的 SAS 数据集,它没有根据要合并的变量进行排序,我必须先对其进行排序(这可能需要相当长的时间)。如果我在 PROC SQL 中使用子查询,我可以有选择地读取数据集,因此不需要排序。

我敢打赌,PROC SQL 对于您只需要一小部分的大型数据集来说要快得多。