2012-11-04 61 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

相关问题