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

时间:2016-02-24 05:44:54

标签: 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        10/12/2016
x4        1/1/2016

数据集D1可以具有重复的ID值。数据集D2仅具有唯一的ID值。此外,D2仅包含数据集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)

data x;
 merge D1 (in=in1) D2(in=in2);
 by ID;
 if in1;
run;

2 个答案:

答案 0 :(得分:1)

  

如果不在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。

答案 1 :(得分:0)

当只有一个数据集具有唯一ID时,两个数据集的DATA步合并工作正常。合并的问题是每个数据集的DATE变量都会发生碰撞:

if ((userDigitalNumber >= MIN_VALUE) and (userDigitalNumber =< MAX_VALUE)):

MSGLEVEL = i选项在日志中生成INFO:行,提醒您发生冲突。在这种情况下,尽管发生碰撞,您几乎可以获得所需的结果。问题是第三条记录,缺少DATE。这是在一对多合并中发生碰撞的副作用。

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

Hello
World!