您好我正在尝试对具有以下
的数据集进行子集化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;
但是有些不对劲。
答案 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