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

时间:2016-11-16 23:30:45

标签: 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    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

4 个答案:

答案 0 :(得分:1)

Double DoW循环解决方案:

guard

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

答案 1 :(得分:0)

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

替代方案可以是:

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

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

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

    proc sort data = intermediate; by Permco RDQ; run;

    数据最终; merge input_data_1(in = a)intermediate(in = b); 由Permco RDQ提供; 如果一个; 运行;

答案 2 :(得分:0)

我假设你想在permco和rdq定义的by-group中使用相同的数字。使用变量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;

答案 3 :(得分:0)

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

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;