SAS数据:如何删除只发生一次的观察结果

SAS数据:如何删除只发生一次的观察结果,sas,datastep,Sas,Datastep,在SAS中,假设我有一个名为“person\u groups”的数据集。它有两个变量,分别是“个人”和“团体”。这个数据集只是将每个人分配给一个组 如何从该数据集中删除组中没有其他人的所有人?换句话说,我如何删除所有单例组 [我很乐意使用procsql解决方案或data step解决方案,两者都可以。] 旁注:我是SAS的新手。我使用C++和Matlab已经很多年了。我觉得我无法理解如何使用SAS数据步骤。它看起来非常笨重、怪异和不雅。坦白说,我越来越沮丧了。有人对疲惫的人抱有希望吗?:) 这里

在SAS中,假设我有一个名为“person\u groups”的数据集。它有两个变量,分别是“个人”和“团体”。这个数据集只是将每个人分配给一个组

如何从该数据集中删除组中没有其他人的所有人?换句话说,我如何删除所有单例组

[我很乐意使用
procsql
解决方案或
data step
解决方案,两者都可以。]


旁注:我是SAS的新手。我使用C++和Matlab已经很多年了。我觉得我无法理解如何使用SAS数据步骤。它看起来非常笨重、怪异和不雅。坦白说,我越来越沮丧了。有人对疲惫的人抱有希望吗?:)

这里有一种使用数据步骤的方法。此方法需要排序

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;

下面是一个
PROC-SQL
解决方案:

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

正如您所看到的,
procsql
主要遵循标准的ANSI语法,因此您现有的SQL技能应该是可移植的。并在SAS数据步进编程方面保持不变;语言极其丰富,功能齐全,决不是“不雅”。您可能见过不雅的代码,但这更可能是程序员的错。花几分钟的时间读一下。

谢谢。在数据步骤中使用“by”语句和“delete”语句似乎非常有用。了解他们,我想我现在可以做得更多。非常感谢。也许我应该尝试更多地依赖procsql而不是sasdatastep,至少在我进一步了解datastep编程之前是这样。proc sql能完成data step所能完成的大部分工作吗?谢谢,我一定会阅读该手册。数据步骤的一个方便方面是,当您进行合并并使用IN=选项标识数据集时,您可以确定每个记录的合并状态。在一个数据步骤中只需一次,但我相信在PROC-SQL中需要多次。尽管如此,每个数据集都必须在数据步骤之前进行排序,因此它可能最终成为清洗效率方面的明智选择。如果您打算使用SAS,我绝对建议您学习数据步骤技术。我想大多数事情都可以在这两个步骤中完成,但肯定有一些事情你更愿意在数据步骤中完成——大概像这一步;我希望data step解决方案更快。