在sas中每组填写相同的值

fill in with same value each group in sas

当 rdq=adq 时,我试图为 SAS 中的每个 permco 填充具有相同 ID 号的 ID1 变量。这是我的数据示例。

    permco   rdq    adq       ID       ID1   
      1      333    331        1        .
      1      333    332        2        .   
      1      333    333        3        3  
      1      333    334        4        .
      1      333    335        5        .
      1      333    336        6        . 
      1      555    552        1        . 
      1      555    553        2        . 
      1      555    554        3        . 
      1      555    555        4        4 
      1      555    556        5        . 
      1      555    557        6        . 
      1      555    558        7        .
      2      333    331        1        .
      2      333    332        2        .   
      2      333    333        3        3  
      2      333    334        4        .
      2      333    335        5        .
      2      333    336        6        . 
      2      555    552        1        . 
      2      555    553        2        . 
      2      555    554        3        . 
      2      555    555        4        4 
      2      555    556        5        . 
      2      555    557        6        . 
      2      555    558        7        .

而我渴望拥有的是...

    permco   rdq    adq       ID       ID1   
      1      333    331        1        3
      1      333    332        2        3   
      1      333    333        3        3  
      1      333    334        4        3
      1      333    335        5        3
      1      333    336        6        3 
      1      555    552        1        4 
      1      555    553        2        4 
      1      555    554        3        4 
      1      555    555        4        4 
      1      555    556        5        4 
      1      555    557        6        4 
      1      555    558        7        4
      2      333    331        1        3
      2      333    332        2        3   
      2      333    333        3        3  
      2      333    334        4        3
      2      333    335        5        3
      2      333    336        6        3 
      2      555    552        1        4 
      2      555    553        2        4 
      2      555    554        3        4 
      2      555    555        4        4 
      2      555    556        5        4 
      2      555    557        6        4 
      2      555    558        7        4

我想在rdq=adq时用身份证号填ID1

如果您的数据类似于 Permco 和 RDQ 的组合,您具有 ID 1 的唯一值,您需要为该组合填写相同的值:

备选方案可以是:

  • 创建一个只有 3 列的单独数据集:Permco、RDQ 和 ID1 ,删除 ID1 为空的行。
  • 将您的输入数据与 Permco 和 RDQ 上的这些数据合并。

    中间数据; 设置 input_data(保留 Permco RDQ ID1); 如果 ID1=.然后删除; 运行;

    proc sort data=input_data out=input_data_1(drop ID1);by Permco RDQ;运行;

    proc sort data=intermediate;by Permco RDQ;运行;

    数据最终; 合并 input_data_1(in=a) 中间体(in=b); 通过 Permco RDQ; 如果一个; 运行;

我假设您希望在 permco 和 rdq 定义的分组中有相同的数字。在一个组中有两个或多个匹配的可能性由变量 matchespergroup 处理。如果在一组中找不到匹配项,则 id1 为缺失值。

data have01;
infile cards truncover expandtabs;
input permco   rdq    adq       ID       ID1  ;
cards;
      1      333    331        1        .
      1      333    332        2        .   
      1      333    333        3        3  
      1      333    334        4        .
      1      333    333        5        5
      1      333    336        6        . 
      1      555    552        1        . 
      1      555    553        2        . 
      1      555    554        3        . 
      1      555    555        4        4 
      1      555    556        5        . 
      1      555    557        6        . 
      1      555    558        7        .
      2      333    331        1        .
      2      333    332        2        .   
      2      333    333        3        3  
      2      333    334        4        .
      2      333    335        5        .
      2      333    336        6        . 
      2      555    552        1        . 
      2      555    553        2        . 
      2      555    554        3        . 
      2      555    555        4        4 
      2      555    556        5        . 
      2      555    557        6        . 
      2      555    558        7        .
run;


data want(drop=rv);
if 0 then set have01;
if _N_=1 then 
    do;
        declare hash hh(dataset:"have01(where=(adq=rdq))",ordered:'A',multidata:'Y');
        hh.definekey('permco','rdq');
        hh.definedata('id1');
        hh.definedone();
    end;
do until(theend);
    set have01 end=theend;
    rv = hh.find();
    hh.has_next(result: matchespergroup);
    if rv=0 then do; matchespergroup+1; output;end;
    else do; id1 = .;output;end;
end;
run;

我认为这里不需要循环。您需要做的就是在每个组中找到您想要的值并将其合并回原始数据集:

proc sql;
    create table temp as select distinct
        permco, rdq, id
        from have (where = (rdq = adq));
quit;

proc sql;
    create table want as select distinct
        a.*, b.id as id_filled
        from have as a
        left join temp as b
        on a.permco = b.permco and a.rdq = b.rdq;
quit;

双DoW循环解法:

data have01;
infile cards truncover expandtabs;
input permco   rdq    adq       ID       ID1  ;
cards;
      1      333    331        1        .
      1      333    332        2        .   
      1      333    333        3        3  
      1      333    334        4        .
      1      333    333        5        5
      1      333    336        6        . 
      1      555    552        1        . 
      1      555    553        2        . 
      1      555    554        3        . 
      1      555    555        4        4 
      1      555    556        5        . 
      1      555    557        6        . 
      1      555    558        7        .
      2      333    331        1        .
      2      333    332        2        .   
      2      333    333        3        3  
      2      333    334        4        .
      2      333    335        5        .
      2      333    336        6        . 
      2      555    552        1        . 
      2      555    553        2        . 
      2      555    554        3        . 
      2      555    555        4        . 
      2      555    556        5        . 
      2      555    557        6        . 
      2      555    558        7        .
;
run;

data want;
do _n_ = 1 by 1 until (last.rdq);
    set have01;
    by permco rdq;
    if first.rdq then call missing(ID1);
    if adq = rdq then t_ID1 = ID1;
    drop t_ID1;
end;
do _n_ = 1 to _n_;
    set have01;
    ID1 = t_ID1;
    output;
end;
run;

这假定如果有多个匹配项,最后一个应优先。如果没有匹配项,则该组的每一行都会有一个缺失值。