Merge 如何合并给定的两个SAS数据集

Merge 如何合并给定的两个SAS数据集,merge,sas,Merge,Sas,我有两个以下类型的SAS数据集 数据集1,D1如下 ID Date Amount x1 10/12/2015 100 x2 200 x2 150 x3 10/10/2014 90 x4 60 数据集,D2的形式为 ID Date x2

我有两个以下类型的SAS数据集

数据集1,D1如下

ID        Date             Amount
x1        10/12/2015       100
x2                         200  
x2                         150 
x3        10/10/2014       90 
x4                         60 
数据集,D2的形式为

ID        Date
x2        10/12/2016
x4        1/1/2016
数据集D1可以有重复的ID值。数据集D2只有唯一的ID值。此外,数据集D1中只有缺少变量日期值的ID(x2和x4在D1中缺少日期)。我想合并D1和D2,这样输出如下

ID        Date             Amount
x1        10/12/2015       100
x2        10/12/2016       200  
x2        10/12/2016       150 
x3        10/10/2014       90 
x4        1/1/2016         60
在SAS中不使用proc sql是否可行。我可以使用合并吗

我尝试了使用以下内容,但没有任何用处(因为D1有重复的ID,所以也不应该起作用)

在SAS中不使用proc sql是否可行。我可以使用合并吗

是的,任何SQL步骤都可以在数据步骤中完成,但可能会占用更多或更少的代码空间

以下是一个潜在的解决方案:

data DateN DateY;
    set D1;
    if date=. then output step1;
    else output step2;
run;

data merge;
    DateN(keep=ID Amount) D2;
    by id;
run;

data x;
    set merge DateY;
run;

proc sort data=x; 
    by ID;
run;
这假定D1中缺少的值具有唯一ID

在SAS中不使用proc sql是否可行。我可以使用合并吗

是的,任何SQL步骤都可以在数据步骤中完成,但可能会占用更多或更少的代码空间

以下是一个潜在的解决方案:

data DateN DateY;
    set D1;
    if date=. then output step1;
    else output step2;
run;

data merge;
    DateN(keep=ID Amount) D2;
    by id;
run;

data x;
    set merge DateY;
run;

proc sort data=x; 
    by ID;
run;

这假设D1中缺少的值具有唯一ID。

当只有一个数据集具有唯一ID时,两个数据集的数据步骤合并工作正常。合并的问题是每个数据集的日期变量将发生冲突:

231  options msglevel=i;
232  data x;
233   merge D1 D2;
234   by ID;
235   put (ID Date Amount)(=);
236  run;

INFO: The variable Date on data set WORK.D1 will be overwritten by data set WORK.D2.
ID=x1 Date=10/12/2015 Amount=100
ID=x2 Date=10/12/2016 Amount=200
ID=x2 Date=. Amount=150
ID=x3 Date=10/10/2014 Amount=90
ID=x4 Date=01/01/2016 Amount=60
MSGLEVEL=i选项在日志中生成INFO:行,用于提醒您发生冲突。在这种情况下,尽管发生了碰撞,但您几乎得到了想要的结果。问题是第三条记录,其中缺少日期。这是一对多合并中发生冲突的副作用

我建议您通过重命名每个数据集中的日期变量来避免冲突。然后,您可以使用COALESCE()函数计算新的日期变量,该函数返回第一个未丢失的值:

237  data want;
238    merge d1 (keep=ID Date Amount rename=(Date=Date1))
239          d2 (keep=ID Date rename=(Date=Date2))
240    ;
241    by ID;
242    Date=coalesce(Date1,Date2);
243    put (ID Date1 Date2 Date Amount)(=);
244    format Date mmddyy10.;
245  run;

ID=x1 Date1=10/12/2015 Date2=. Date=10/12/2015 Amount=100
ID=x2 Date1=. Date2=10/12/2016 Date=10/12/2016 Amount=200
ID=x2 Date1=. Date2=10/12/2016 Date=10/12/2016 Amount=150
ID=x3 Date1=10/10/2014 Date2=. Date=10/10/2014 Amount=90
ID=x4 Date1=. Date2=01/01/2016 Date=01/01/2016 Amount=60

当只有一个数据集具有唯一ID时,两个数据集的数据步骤合并工作正常。合并的问题是每个数据集的日期变量将发生冲突:

231  options msglevel=i;
232  data x;
233   merge D1 D2;
234   by ID;
235   put (ID Date Amount)(=);
236  run;

INFO: The variable Date on data set WORK.D1 will be overwritten by data set WORK.D2.
ID=x1 Date=10/12/2015 Amount=100
ID=x2 Date=10/12/2016 Amount=200
ID=x2 Date=. Amount=150
ID=x3 Date=10/10/2014 Amount=90
ID=x4 Date=01/01/2016 Amount=60
MSGLEVEL=i选项在日志中生成INFO:行,用于提醒您发生冲突。在这种情况下,尽管发生了碰撞,但您几乎得到了想要的结果。问题是第三条记录,其中缺少日期。这是一对多合并中发生冲突的副作用

我建议您通过重命名每个数据集中的日期变量来避免冲突。然后,您可以使用COALESCE()函数计算新的日期变量,该函数返回第一个未丢失的值:

237  data want;
238    merge d1 (keep=ID Date Amount rename=(Date=Date1))
239          d2 (keep=ID Date rename=(Date=Date2))
240    ;
241    by ID;
242    Date=coalesce(Date1,Date2);
243    put (ID Date1 Date2 Date Amount)(=);
244    format Date mmddyy10.;
245  run;

ID=x1 Date1=10/12/2015 Date2=. Date=10/12/2015 Amount=100
ID=x2 Date1=. Date2=10/12/2016 Date=10/12/2016 Amount=200
ID=x2 Date1=. Date2=10/12/2016 Date=10/12/2016 Amount=150
ID=x3 Date1=10/10/2014 Date2=. Date=10/10/2014 Amount=90
ID=x4 Date1=. Date2=01/01/2016 Date=01/01/2016 Amount=60

D1中可能有多条记录缺少日期值和相同ID。此假设可能不适用于我“D1中缺少的值具有唯一ID”。D1中可能有多条记录缺少日期值和相同ID。此假设可能不适用于我“D1中缺少的值具有唯一ID”.我最后写了一个proc-SQL段,因为我时间不够,但我一直想知道,如果没有SQL,我是否可以做到这一点。谢谢你的回答。由于时间不够,我终于写了一个proc-SQL段,但我一直想知道,如果没有SQL,我是否可以做到这一点。谢谢你的回答。