2012-11-04 89 views
2

在SAS中,假設我有一個名爲「person_groups」的數據集。它有兩個變量,名爲「人」和「組」。該數據集只是將每個人分配給一個組。SAS數據:如何刪除只發生一次的觀察

如何從此數據集中刪除所有在他們組中沒有其他人的人?換句話說,我如何刪除所有單身人士團體?

[我很樂意與proc sql解決方案或data step的解決方案 - 無論是好的。]

附註:我是新來的SAS。我一直在使用C++和MATLAB多年。我覺得我不明白如何用SAS DATA步驟來做任何事情。它看起來非常笨重,古怪,不雅。坦率地說,我越來越沮喪。那裏的任何人都有希望厭倦? :)

回答

4

這是一種使用數據步驟的方法。這種方法需要排序。

data person_groups; 
input person $ group $; 
datalines; 
John Grp1 
Mary Grp3 
Joe Grp2 
Jane Grp3 
Frank Grp1 
; 

Proc Sort data=person_groups; 
by group; 
run; 

Data person_groups; 
set person_groups; 
by group; 
if first.group and last.group then delete; 
run; 
+0

謝謝。在數據步驟中使用「by」語句和「刪除」語句似乎非常有用。瞭解他們,我想我現在可以做更多。 – synaptik

2

這裏是一個PROC SQL解決方案:

proc sql; 
    delete from person_groups 
    where group in (
     select group 
     from person_groups 
     group by 1 
     having count(*) = 1 
    ); 
quit; 

正如你所看到的,大多PROC SQL遵循標準ANSI語法,所以你現有的SQL技能應該是相當便攜。並且在SAS Data Step編程方面掛在那裏;該語言非常豐富,功能全面,絕非「不雅」。你可能看到過不雅的代碼,但這更可能是程序員的錯誤。花幾分鐘時間閱讀SAS Concepts manual

+0

非常感謝。也許我應該嘗試依賴proc sql而不是SAS數據步驟,至少在我學習更多關於數據步驟編程的知識之前。 proc sql可以做數據步驟可以做的事情的很大比例嗎?謝謝,我一定會閱讀那本手冊。 – synaptik

+0

數據步驟的一個方便之處在於,當您執行MERGE並且使用IN =選項識別數據集時,您可以確定每條記錄的合併狀態。你可以在數據步驟中通過一次傳遞來獲得這個,但是我相信在PROC SQL中需要多次傳遞。雖然,每個數據集必須在數據步驟之前進行排序,但最終可能會成爲清洗效率的最佳選擇。 –

+0

如果你打算使用SAS,我絕對推薦學習數據步驟技巧。我想大多數事情都可以完成,但在數據步驟中肯定會做一些事情 - 比如這個,大概是這樣的;我希望數據步驟解決方案更快。 – Joe

相關問題