使用每个 ID 具有多行的 SAS 来保留该 ID 的所有记录(如果其中任何记录包含 State=MI)

问题描述 投票:0回答:1

我有一个大型数据集,其中的列如下:

|身份证 |状态|

| 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 */
            );         `

创建了某种表,但它是空的 - 我想我需要在某处添加数据语句?

sas proc
1个回答
0
投票

假设您的意思是您有一个这样的数据集:

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;
© www.soinside.com 2019 - 2024. All rights reserved.