使用sas

时间:2015-04-22 12:25:33

标签: sas

您好我正在尝试对具有以下

的数据集进行子集化
ID sal count 
1  10  1
1  10  2
1  10  3
1  10  4
2  20  1
2  20  2
2  20  3
3  30  1
3  30  2
3  30  3
3  30  4

我只想取出4次录制的ID。

我写的像

data AN; set BU
if last.count gt 4 and last.count lt 4 then delete;
run;

但是有些不对劲。

2 个答案:

答案 0 :(得分:2)

编辑 - 感谢您的澄清。根据您的需求,PROC SQL将更直接:

proc sql;
  CREATE TABLE AN as
  SELECT * FROM BU
  GROUP BY ID
  HAVING MAX(COUNT) = 4
;quit;

对于后代,以下是仅使用数据步骤的方法:

要使用first.last.,您需要使用by子句,这需要排序:

proc sort data=BU;
 by ID DESCENDING count;
run;

当使用SET语句BY ID时,first.ID将在给定ID的第一个实例上等于1(TRUE),对于所有其他记录将等于0(FALSE)。

data AN;
  set BU;
  by ID;
  retain keepMe;
  If first.ID THEN DO;
     IF count = 4 THEN keepMe=1;
     ELSE keepMe=0;
  END;

  if keepMe=0 THEN DELETE;
run;

在datastep BY ID期间,您的数据将如下所示:

ID sal count keepMe  first.ID
1  10  4     1       1
1  10  3     1       0
1  10  2     1       0
1  10  1     1       0
2  20  3     0       1
2  20  2     0       0
2  20  1     0       0
3  30  4     1       1
3  30  3     1       0
3  30  2     1       0
3  30  1     1       0

答案 1 :(得分:1)

如果我理解正确,你试图提取所有观察结果重复4次或更多次。如果是这样,你使用last.count和first.count是错误的。 last.var是一个布尔值,它将指示哪个观察在组中的最后一个。看看蒂姆的建议。

为了提取重复四次或更多次的所有观察,我建议使用以下PROC SQL:

PROC SQL;
   CREATE TABLE WORK.WANT AS 
   SELECT /* COUNT_of_ID */
            (COUNT(t1.ID)) AS COUNT_of_ID, 
          t1.ID, 
          t1.SAL, 
          t1.count
      FROM WORK.HAVE t1
      GROUP BY t1.ID
      HAVING (CALCULATED COUNT_of_ID) ge 4
      ORDER BY t1.ID,
           t1.SAL,
           t1.count;
QUIT;

结果:

1   10  1
1   10  2
1   10  3
1   10  4
3   30  1
3   30  2
3   30  3
3   30  4