我正在尝试用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答案 0 :(得分:1)
Double DoW循环解决方案:
guard
这假定如果有多个匹配,则最后一个匹配优先。如果没有匹配,则该组的每一行都会丢失一个值。
答案 1 :(得分:0)
如果您的数据类似于Permco和RDQ的组合,则您具有ID 1的唯一值,并且您需要为该组合填写相同的值:
替代方案可以是:
将输入数据与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;