Events 在sas中用相同的值填写每组

Events 在sas中用相同的值填写每组,events,sas,finance,Events,Sas,Finance,当SAS中的每个permco的rdq=adq时,我试图用相同的ID号填充ID1变量。下面是我的数据示例 permco rdq adq ID ID1 1 333 331 1 . 1 333 332 2 . 1 333 333 3 3 1 333 3

当SAS中的每个permco的rdq=adq时,我试图用相同的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时,我想用ID号填写ID1。

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

另一种选择是:

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

    数据中介; 设置输入数据(保持Permco RDQ ID1); 如果ID1=。然后删除; 运行

    proc sort data=input\U data out=input\U data\U 1(drop ID1);Permco RDQ;运行

    proc排序数据=中间;Permco RDQ;运行

    最终数据; 合并输入数据1(in=a)中间(in=b); Permco RDQ; 如有,; 运行


我假设您希望在permco和rdq定义的by组中拥有相同的编号。使用变量matchespergroup处理一个by group中有两个或多个匹配项的可能性。如果在一个组中未找到匹配项,则缺少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;

双道回路解决方案:

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;

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

每个
permco
或每个
rdq
?这个问题非常相似-相同的方法在这里也会起作用:只有当每个by组中都有一行
rdq=adq
时,这才会起到预期的作用。如果甚至有一个具有不同行数的by组与此条件匹配,则循环的所有后续迭代都将与第一个set语句不同步。True。更新了我的帖子以包含这种可能性。如果一个by组中有0个匹配行怎么办?真的。更新了我的帖子,加入了这种可能性。我不能用道琼斯指数循环来做这件事。我使用了散列对象。由于我不知道一个组中多个匹配项的所需策略是(问题没有指定),因此我还创建了一个变量,其中包含每个组中的匹配项数量。如果现在有几个匹配项,那么将使用第一个匹配项。但是,变量'code'(matchesingroup)将返回一个大于1的数字。
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;