这是我今天第一次打开sas并且正在查看同事写的一些代码。
所以,假设我有一些数据(import
),其中有重复项,但我只想要那些名为VTNR的唯一编号。
首先,她寻找独特的数字:
data M.import;
set M.import;
by VTNR;
if first.VTNR=1 then unique=1;
run;
然后她创建了一个包含重复数字的表:
data M.import_dup1;
set M.import;
where unique^=1;
run;
最后是一张包含所有副本的表格。 但在这里,她真的很难编码,例如:
data M.import_dup2;
set M.import;
where VTNR in (130001292951,130100975613,130107546425,130108026864,130131307133,130134696722,130136267001,130137413257,130137839451,130138291041);
run;
我确信必须有更好的方法。
由于我只熟悉R,我会写一些类似的东西:
import_dup2 <- subset(import, is.element(import$VTNR, import_dup1$VTNR))
我想对sas来说肯定有类似$
的东西吗?
答案 0 :(得分:2)
对我而言,它看起来像是R代码的最直接翻译
import_dup2 <- subset(import, is.element(import$VTNR, import_dup1$VTNR))
将使用SQL代码
proc sql;
create table import_dup2 as
select * from import
where VTNR in (select VTNR from import_dup1)
;
quit;
但是如果您的意图是在IMPORT中找到每个VTNR值有多个观察值的观察结果,则无需先创建其他表格。
data import_dup2 ;
set import;
by VTNR ;
if not (first.VTNR and last.VTNR);
run;
答案 1 :(得分:1)
我会使用PROC SORT中的选项。 确保指定OUT =数据集,否则您将覆盖原始数据。
/*Generate fake data with dups*/
data class;
set sashelp.class sashelp.class(obs=5);
run;
/*Create unique and dup dataset*/
proc sort data=class nouniquekey uniqueout=uniquerecs out=dups;
by name;
run;
/*Display results - for demo*/
proc print data=uniquerecs;
title 'Unique Records';
run;
proc print data=dups;
title 'Duplicate Records';
run;
答案 2 :(得分:0)
以上解决方案可以为您提供重复但不是唯一值。在SAS中有很多可能的方法可以做到这两点。很容易理解的是SQL解决方案。
proc sql;
create table no_duplicates as
select *
from import
group by VTNR
having count(*) = 1
;
create table all_duplicates as
select *
from import
group by VTNR
having count(*) > 1
;
quit;
答案 3 :(得分:0)
我会使用Reeza或Tom的解决方案,但为了完整性,与R(以及您之前存在的代码)类似的解决方案 most 将分为三个步骤。同样,我不会在这里使用它,它可以更容易地做一些过多的工作,但这个概念在其他情况下很有用。
首先,获取重复数据集 - 她的方法或proc sort
。
proc sort nodupkey data=have out=nodups dupout=dups;
by byvar;
run;
然后将它们拉入宏列表:
proc sql;
select byvar
into :duplist separated by ','
from dups;
quit;
然后你将它们放在&duplist.
中,可以这样使用它们:
data want;
set have;
if not (byvar in &duplist.);
run;
答案 4 :(得分:-2)
data want;
set import;
where VTNR in import_dup1;
run;