我有一个大型数据集,其中的列如下:
|身份证 |状态|
| 1 |米 | | 1 |加州 | | 2 |加州 | | 2 |加州 | | 3 |怀俄明 | | 3 |怀Y |
我想将以下记录保留在新数据集中,如果任何ID的状态包含CA,则保留其所有记录,否则删除这些行。
结果 |身份证 |状态|
| 1 |米 | | 1 |加州 | | 2 |加州 | | 2 |加州 |
如何使用 SAS 做到这一点?
`libname sql 'D:/Ro/';
proc sql;
create table sql.idstate
(state char(2), /* 2–character column for */
/* state abbreviation */
ID num /* column for date of entry into the US */
); `
创建了某种表,但它是空的 - 我想我需要在某处添加数据语句?
假设您的意思是您有一个这样的数据集:
data have;
input ID State :$2.;
cards;
1 MI
1 CA
2 CA
2 CA
3 WY
3 WY
;
然后您应该能够在 PROC SQL 中使用带有 IN 运算符的子查询。
proc sql;
create table want as
select * from have
where id in (select id from have where state='CA')
;
quit;
如果您在大型数据集上遇到性能问题,并且它已经按 ID 排序,那么数据步骤可能会表现得更好。数据步骤还必须通过数据集两次,但它可以一次执行一个 ID,因此可以利用操作系统可能已经在执行的磁盘缓存。
data want;
do until(last.id);
set have;
by id;
if state='CA' then flag=1;
end;
do until(last.id);
set have;
by id;
if flag=1 then output;
end;
drop flag;
run;