2013-07-15 52 views
0

我有一個這樣的數據集:如何刪除某列中的某些觀察值?

id 
3408 
3408 
3485 
4592 
4932 
5345 
5345 
5345 
5844 
5844 
5844 

我只是想保持出現3次(即keep id=5345 and id=5844),並刪除其餘的ID。我如何在SAS中實現這一點?我的資料按順序排列按id排序。我想保持在輸出數據集中

+0

@monkey,如果你有一個問題,想更新你的問題,您可以將stats.stackexchange.com帳戶與關聯StackOverflow之一。建議編輯不是一種方法,您也無法接受答案。祝你好運,並歡迎:) –

回答

2

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; 
+0

這個想法是正確的,但是你的代碼包含錯誤。你需要保持count變量能夠在where子句中使用它。 + where子句需要在括號內保存條件。我仍然會採用cmjohns的方法,但這並不複雜,可能資源更少。 (當然,只有在非常大的數據集中才有問題) – mvherweg

+0

是的,這裏編碼太快:)修正。 – Joe

+0

我在SAS中的首選是當我正在做一些PROC要做的事情時使用PROCs。它通常比數據步驟更快(因爲它是編譯代碼),即使不是,其他程序員對我所做的更清楚。 – Joe

3

所有三個重複的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; 
2

我不知道,如果你想只是一個出現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; 
+0

這隻保留與3重複ID第三行。我如何保持所有三行具有相同的ID? – monkey

+0

要獲得所有匹配的行,您可以將其合併回原始數據集。 – cmjohns