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;