SAS相当于R的is.element()

时间:2016-07-12 12:17:13

标签: sas duplicates unique subset

这是我今天第一次打开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来说肯定有类似$的东西吗?

5 个答案:

答案 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;