过滤 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 对于您只需要一小部分的大型数据集来说要快得多。
我在 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 对于您只需要一小部分的大型数据集来说要快得多。