假设有以下数据集:
data have;
input ID :$20. Admission :date09. Discharge :date09. Index Variable1 Variable2;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2015 20JAN2015 1 2 4
0001 21FEB2015 31DEC2015 0 . 2
0001 21FEB2015 31DEC2015 0 3 .
0001 01JAN2019 31DEC2019 0 6 9
0002 01JAN2015 31DEC2015 0 2 .
0002 01JAN2019 31OCT2019 1 . 2
0002 01JAN2019 31OCT2019 0 . 2
;
然后,我有另一个数据集,看起来像这样,来自其他计算:
data have1;
input ID :$20. Admission :date09. Discharge :date09. Index Variable1 Variable2;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2015 20JAN2015 1 6 8
0002 01JAN2019 31OCT2019 1 4 2
;
有办法获得以下内容吗?
data have2;
input ID :$20. Admission :date09. Discharge :date09. Index Variable1 Variable2;
format Admission date9. Discharge date9.;
cards;
0001 13JAN2015 20JAN2015 1 6 8
0001 21FEB2015 31DEC2015 0 . .
0001 21FEB2015 31DEC2015 0 . .
0001 01JAN2019 31DEC2019 0 . .
0002 01JAN2015 31DEC2015 0 . .
0002 01JAN2019 31OCT2019 1 4 2
0002 01JAN2019 31OCT2019 0 . .
;
换句话说,我想用have1(其中Index = 1)中的值替换have中的值。 have 中的剩余部分应设置为“.”。拥有 拥有 3.变量总数:为 50。为简单起见,这里仅显示 2 个。
提前谢谢您
您可以通过两种方式做到这一点:
让我们看看两者。
简单合并
我们要通过键进行合并,即
ID Admission Discharge Index
的组合。首先,我们将对两个数据集进行排序,然后按此键合并它们。如果按键组合匹配,我们会将 Variable1
和 Variable2
设置为 0。
proc sort data=have;
by id admission discharge index;
run;
proc sort data=have1;
by id admission discharge index;
run;
data want;
merge have(in=h)
have1(in=h1)
;
by id admission discharge index;
if(h NE h1) then call missing(of variable:);
run;
哈希连接
这与简单的合并非常相似,但不需要排序。我们将
have1
视为一个查找表,并为每场比赛从中提取值。如果找不到匹配项,我们会将 Variable1
和 Variable2
的值设置为缺失。
data want;
set have;
if(_N_ = 1) then do;
dcl hash h1(dataset:'have1');
h1.defineKey('id', 'admission', 'discharge', 'index');
h1.defineData('variable1', 'variable2');
h1.defineDone();
end;
if(h1.Find() NE 0) then call missing(of variable:);
run;
ID Admission Discharge Index Variable1 Variable2
0001 13JAN2015 20JAN2015 1 6 8
0001 21FEB2015 31DEC2015 0 . .
0001 21FEB2015 31DEC2015 0 . .
0001 01JAN2019 31DEC2019 0 . .
0002 01JAN2015 31DEC2015 0 . .
0002 01JAN2019 31OCT2019 1 4 2
0002 01JAN2019 31OCT2019 0 . .