【问题标题】:In SAS: How to flag unique combinations of a set of variable values在 SAS 中:如何标记一组变量值的唯一组合
【发布时间】:2018-11-28 08:35:31
【问题描述】:

在 SAS 中,如何为一组变量的每个唯一组合创建一个标识符?

例如,我有几千个观察值,其中六个变量的值是二分法。对于每个观察值,这些变量的值有 2^6 种唯一组合。我想为每个唯一组合创建一个标识符,并最终根据这个值对我的观察结果进行分组。

有:

SubjectID     Var1     Var2     Var3     Var4     Var5     Var6
---------------------------------------------------------------
ID1           1        1        1        1        1        1        
ID2           1        0        1        1        1        1  
ID3           0        1        1        1        1        1  
ID4           0        0        1        1        1        0  
...           ...      ...      ...      ...      ...      ...
ID3000        1        1        0        1        0        0  

想要:

SubjectID     Var1     Var2     Var3     Var4     Var5     Var6     Identifier
------------------------------------------------------------------------------
ID1           1        1        1        1        1        1        A        
ID2           1        1        1        1        1        1        A
ID3           0        1        1        1        1        1        B  
ID4           0        0        1        1        1        0        C  
...           ...      ...      ...      ...      ...      ...
ID3000        1        1        0        1        0        0        Z

A 将表示 1、1、1、1、1、1 作为唯一组合,B 将表示 0、1、1、1、1、1 等。

我考虑过基于 64 个 Var1-Var6 条件语句创建一个虚拟变量。我还考虑过将 Var1-Var6 中的值连接到新行中以创建唯一标识符。

有没有更直接的方法来解决这个问题?

我更喜欢一种将特定标识符分配给特定值组合的方法,而不是在出现新组合时仅生成一些任意唯一字符串的方法。

【问题讨论】:

    标签: sas


    【解决方案1】:

    Proc 摘要与 LEVELS 选项配合得很好。此技术适用于组变量数字或字符的任何值。

    data have;
       input (v1-v6)(1.);
       cards;
    111111
    111110
    111101
    111011
    110111
    ;;;;
    proc print;
    proc summary data=have nway;
       class v1-v6;
       output out=unique(drop=_type_) / levels;
       run;
    

    【讨论】:

      【解决方案2】:

      为什么不直接连接这些值呢? 所以你的组合是:

      111111
      111110
      111101
      111011
      110111
      ....
      

      您可以使用 PROC FREQ 来检查每种类型的数量。

      proc freq data=have;
      table var1*var2*var3*var4*var5*var6 / out=want list;
      run;
      

      【讨论】:

        【解决方案3】:

        通过使用给定变量组合的唯一值,然后创建一个按字母顺序排列的 ID 列表,您可以创建结果

        data inp;
        length combined $6.;
        input subjectid $4. v1 1. v2 1. v3 1. v4 1. v5 1. v6 1.;
        combined=compress(v1||v2||v3||v4||v5||v6);
        datalines;
        ID1 111111
        ID2 011111
        ID3 001111
        ID4 111110
        ID5 000111
        ID6 111111
        ID7 000111
        ;
        run;
        
        proc sql;
        create table uniq
        as
        select distinct combined from inp order by combined desc;
        quit;
        
        data uniq1;
         set uniq;
         retain alphabet 65;
         Id=byte(alphabet) ;
         alphabet+1;
        
         drop alphabet;
        run;
        
        proc sql;
        create table final_ds
        as
        select subjectid, v1, v2, v3, v4, v5, v6, Id
        from inp a
        left join uniq1 b
        on a.combined=b.combined;
        quit;
        

        【讨论】:

          【解决方案4】:

          假设数据按您的分组变量排序,那么只需使用 BY 组处理。

          data want;
            set have;
            by var1-var6 ;
            groupid + first.var6 ;
          run;
          

          或者您可以将 6 个二进制变量转换为一个唯一值。

          group2 = input(cats(of var1-var6),binary6.);
          

          这具有不需要您对数据进行排序的附加价值,但它确实需要不丢失任何分组变量。

          结果

          SubjectID  Var1 Var2 Var3 Var4 Var5 Var6 Identifier Want groupno group2
          ID4  0  0  1  1  1  0 C  1  14
          ID3  0  1  1  1  1  1 B  2  31
          ID1  1  1  1  1  1  1 A  3  63
          ID2  1  1  1  1  1  1 A  3  63
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-06
            • 2019-05-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多