将一个数据集中的值替换为另一个数据集中的值,但仅当变量采用特定值时

问题描述 投票:0回答:1

假设有以下数据集:

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 个。

提前谢谢您

sas
1个回答
0
投票

您可以通过两种方式做到这一点:

  1. 简单的合并
  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       .           .
© www.soinside.com 2019 - 2024. All rights reserved.