Events 在sas中用相同的值填写每组
当SAS中的每个permco的rdq=adq时,我试图用相同的ID号填充ID1变量。下面是我的数据示例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
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; 如有,; 运行
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;