【问题标题】:Select many columns and other non-continuous columns to find duplicate?选择许多列和其他非连续列以查找重复?
【发布时间】:2017-03-10 16:18:16
【问题描述】:

我有一个包含许多这样的列的数据集:

ID  Indicator Name   C1 C2 C3....C90
 A    0001    Black   0  1  1.....0
 B    0001    Blue    1  0  0.....1
 B    0002    Blue    1  0  0.....1

有些 ID 是重复的,因为指示符不同,但它们本质上是相同的记录。要查找重复项,我想选择不同的 ID、名称,然后选择 C1 到 C90 进行检查,因为一些具有相同 ID 和指示符的声明具有不同的 C1...C90 值。

有没有办法通过 proc sql 或 sas 数据步骤来选择 c1...c90?似乎我能想到的唯一方法是设置数据集,然后删除非必要的列,但在实际数据集中,它不仅是指标,而且至少还有 15 个其他列。

【问题讨论】:

    标签: sas proc-sql datastep


    【解决方案1】:

    如果 PROC SQL 像其他 Procs 一样使用 : 变量名通配符,那就太好了。当没有其他合理的选择时,我通常使用宏来选择批量列。这可能对你有用:

    %macro sel_C(n);
        %do i=1 %to %eval(&n.-1);
            C&i.,
        %end;
        C&n.
    %mend sel_C;
    proc sql;
        select ID,
               Indicator,
               Name,
               %sel_C(90)
        from have_data;
    quit;
    

    【讨论】:

    • 我从不知道您可以使用宏选择批量列,这非常有用!
    • 太棒了!祝 PinkyL 好运!
    【解决方案2】:

    如果我正确理解了这个问题,最简单的方法是将列连接到一个。逐行保留该值,您可以跨行比较它以查看它是否相同。

    data want;
      set have;
      by id indicator;
      retain last_cols;
      length last_cols $500;
      cols = catx('|',of c1-c90);
      if first.id then call missing(last_cols);
      else do;
        identical = (cols = last_cols); *or whatever check you need to perform;
      end;
      output;
      last_cols = cols;
    run;
    

    【讨论】:

      【解决方案3】:

      有几种不同的方法可以做到这一点,如果实际的列名是C1 - C90,它会容易得多。如果你只是想删除任何你知道是重复的东西,你可以使用proc sort

      proc sort data=dups out=nodups nodupkey;
      by ID Name C1-C90;
      run;
      

      nodupkey 选项将自动删除by 语句中的所有重复项。

      或者,如果您想知道哪些记录包含重复项,您可以使用proc summary

      proc summary data=dups nway missing;
      class ID Name C1-C90;
      output out=onlydups(where=(_freq_ > 1));
      run;
      

      proc summary 创建两个新变量,_type__freq_。如果您指定_freq_ > 1,您将只输出重复记录。另请注意,这将删除 Indicator 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 2017-08-07
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多