Sas 将信息合并到部门向量中

Sas 将信息合并到部门向量中,sas,Sas,我想通过创建一个向量来总结一个数据集,该向量提供关于id所在部门的信息。比如说, data test; input id dept $; datalines; 1 A 1 D 1 B 1 C 2 C 3 D 4 A 5 C 5 D ; run; 我想要 id dept_vect 1 1111 2 0010 3 0001 4 1000 5 1001 部门要素的位置按字母顺序排列。因此,第一

我想通过创建一个向量来总结一个数据集,该向量提供关于id所在部门的信息。比如说,

data test;
    input id dept $;
    datalines;
    1 A
    1 D
    1 B
    1 C
    2 C
    3 D
    4 A
    5 C
    5 D
    ;
run;
我想要

id dept_vect
1  1111
2  0010
3  0001
4  1000
5  1001
部门要素的位置按字母顺序排列。因此,第一个位置的“1”表示在部门a中找到id,第二个位置的“1”表示在部门B中找到id。a“0”表示在部门中找不到id

我可以用蛮力的方法解决这个问题

proc transpose data = test out = test1(drop = _NAME_);
by id;
var dept;
run;

data test2;
  set test1;
  array x[4] $ col1-col4;
  array d[4] $ d1-d4;

  do i = 1 to 4;
        if not missing(x[i]) then do;
              if x[i] = 'A' then d[1] = 1;
                 else if x[i] = 'B' then d[2] = 1;     
                 else if x[i] = 'C' then d[3] = 1;
                 else if x[i] = 'D' then d[4] = 1;
              end;
        else leave;
    end;

  do i = 1 to 4;
       if missing(d[i]) then d[i] = 0;
  end;

  dept_id = compress(d1) || compress(d2) || compress(d3) || compress(d4);

  keep id dept_id;
 run;
这是可行的,但有几个问题。要显示col4,我需要在所有部门上至少找到一个id,但这可以通过创建一个虚拟id来修复,以便在所有部门上找到id。但主要的问题是,这段代码不够健壮。有没有一种方法可以对其进行编码,从而使其适用于任何数量的部门

  • 添加1以获取计数变量
  • 使用PROC转置进行转置
  • 将缺少的替换为0
  • 使用CATT()创建所需的结果

    data have;
    input id dept $;
    count = 1;
    datalines;
    1 A
    1 D
    1 B
    1 C
    2 C
    3 D
    4 A
    5 C
    5 D
    ;
    run;
    
    proc transpose data=test out=wide prefix=dept; 
    by id;
    id dept;
    var count;
    run;
    
    data want;
    set wide;
    array _d(*) dept:;
    do i=1 to dim(_d);
          if missing(_d(i)) then _d(i) = 0;
    end;
    want = catt(of _d(*));
    run;
    
  • 添加1以获取计数变量
  • 使用PROC转置进行转置
  • 将缺少的替换为0
  • 使用CATT()创建所需的结果

    data have;
    input id dept $;
    count = 1;
    datalines;
    1 A
    1 D
    1 B
    1 C
    2 C
    3 D
    4 A
    5 C
    5 D
    ;
    run;
    
    proc transpose data=test out=wide prefix=dept; 
    by id;
    id dept;
    var count;
    run;
    
    data want;
    set wide;
    array _d(*) dept:;
    do i=1 to dim(_d);
          if missing(_d(i)) then _d(i) = 0;
    end;
    want = catt(of _d(*));
    run;
    

  • 也许TRANSREG可以帮上忙

    data test;
        input id dept $;
        datalines;
        1 A
        1 D
        1 B
        1 C
        2 C
        3 D
        4 A
        5 C
        5 D
        ;
    run;
    proc transreg;
       id id;
       model class(dept / zero=none);
       output design out=dummy(drop=dept);
       run;
    proc print;
       run;
    proc summary nway;
       class id;
       output out=want(drop=_type_) max(dept:)=;
       run;
    proc print;
       run;
    

    也许TRANSREG可以帮上忙

    data test;
        input id dept $;
        datalines;
        1 A
        1 D
        1 B
        1 C
        2 C
        3 D
        4 A
        5 C
        5 D
        ;
    run;
    proc transreg;
       id id;
       model class(dept / zero=none);
       output design out=dummy(drop=dept);
       run;
    proc print;
       run;
    proc summary nway;
       class id;
       output out=want(drop=_type_) max(dept:)=;
       run;
    proc print;
       run;