Merge 如何合并给定的两个SAS数据集
我有两个以下类型的SAS数据集 数据集1,D1如下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
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,我是否可以做到这一点。谢谢你的回答。