Sas 删除某些变量上加倍的所有观察值

Sas 删除某些变量上加倍的所有观察值,sas,Sas,假设我有一张桌子: Name Age Bob 4 Pop 5 Yoy 6 Bob 5 我想删除表中不唯一的所有名称: Name Age Pop 5 Yoy 6 ATM,我的解决方案是创建具有唯一名称计数的新表: Name Count Bob 2 Pop 1 Yoy 1 然后,保留全部,即Count>1 我相信还有更好的解决方案。您可以使用proc-sort和nouniquekey选项。然后使用uniqueout=输出唯一值,并使用out=输出重复值(如果不想覆盖原始

假设我有一张桌子:

Name Age
Bob  4
Pop  5
Yoy  6 
Bob  5
我想删除表中不唯一的所有名称:

Name Age
Pop  5
Yoy  6 
ATM,我的解决方案是创建具有唯一名称计数的新表:

Name Count
Bob  2
Pop  1
Yoy  1 
然后,保留全部,即
Count>1


我相信还有更好的解决方案。

您可以使用
proc-sort
nouniquekey
选项。然后使用
uniqueout=
输出唯一值,并使用
out=
输出重复值(如果不想覆盖原始数据集,则需要使用
out=
语句)


如果我理解正确,有两种方法:

SQL过程

在SAS中,您可能不需要像我在这里介绍的那样使用诸如MIN()之类的汇总函数,但当只有
name
中的一个时,则无论如何
MIN(age)=age
,并且当将其迁移到另一个RDBMS(例如Oracle、SQL Server)时,可能需要:

proc sql;
  create table want as
  select name, min(age) as age
  from have
  group by name
  having count(*) = 1;
quit;
数据步骤

要求对数据进行预排序:

proc sort data=have out=have_stg;
  by name;
run;
在对SAS数据进行分步分组处理时,第一步。(第一个点)和最后一个点。(最后一个点)生成变量,表示当前观测值是by组中的第一个和/或最后一个。如果first.name=1和last.name=1,使用SAS条件逻辑可以简单地测试
。使用逻辑速记来减少这种情况会变成:

data want;
  set have_stg;
  by name;
  if first.name and last.name;
  /* Equivalent to:*/
  *if first.name = 1 and last.name = 1;
run;
我在上面的代码中留下了这两个版本,请使用您认为更可读的版本

data want;
  set have_stg;
  by name;
  if first.name and last.name;
  /* Equivalent to:*/
  *if first.name = 1 and last.name = 1;
run;