我有一個這樣的數據集:如何刪除某列中的某些觀察值?
id
3408
3408
3485
4592
4932
5345
5345
5345
5844
5844
5844
我只是想保持出現3次(即keep id=5345 and id=5844
),並刪除其餘的ID。我如何在SAS中實現這一點?我的資料按順序排列按id
排序。我想保持在輸出數據集中
我有一個這樣的數據集:如何刪除某列中的某些觀察值?
id
3408
3408
3485
4592
4932
5345
5345
5345
5844
5844
5844
我只是想保持出現3次(即keep id=5345 and id=5844
),並刪除其餘的ID。我如何在SAS中實現這一點?我的資料按順序排列按id
排序。我想保持在輸出數據集中
PROC FREQ會直接給你。
proc freq data=myid;
tables id/out=threeobs(keep=count id where=(count=3));
run;
使用> =而不是=如果您的意思是3或更多。 根據意見,這裏是合併回原始數據的例子:
data have;
input id;
datalines;
3408
3408
3485
4592
4932
5345
5345
5345
5844
5844
5844
;;;;
run;
proc freq data=have;
tables id/out=ids(where=(count=3) keep=id count);
run;
proc sort data=have;
by id;
run;
data want;
merge have(in=h) ids(in=i);
by id;
if i;
run;
所有三個重複的ID使用PROC SQL,你可以JOIN
並創建一個新的數據集,這樣的事情:
proc sql;
create table want as
select a.*
from have a
join (
select id
from have
group by id
having count(*) = 3
) b
on b.id=a.id
quit;
我不知道,如果你想只是一個出現3次的ID列表或所有具有被複制3次的ID的行。如果你想要前者,那麼@ bellvueBob的代碼將會幫助你。
否則,這裏有一種方法可以獲得3次出現在數據集中的ID列表。由於數據集已經排序,此代碼的優點是內存使用量和速度很小。
data threeobs(keep=id);
set myid;
by id;
if first.id then cnt=1;
else cnt+1;
if cnt=3 then output;
run;
@monkey,如果你有一個問題,想更新你的問題,您可以將stats.stackexchange.com帳戶與關聯StackOverflow之一。建議編輯不是一種方法,您也無法接受答案。祝你好運,並歡迎:) –