SAS中的一对多合并(记录不匹配)

时间:2018-05-21 12:57:14

标签: merge sas

我正在尝试在SAS中进行合并,这似乎应该很容易,但到目前为止还没有发现任何指向如何做到这一点。我有两个数据集 - 我们称之为Monthly1和Quarterly2。 Monthly1是主要的,我想将Quarterly2合并到它上面。问题是,后者具有不同的周期性,顾名思义。以下是每个人的样子:

MONTHLY1:

id,month,year,qname,data1,data2,data3,data4

1111,01,2018,First Quarter 2018,27,33,55
1111,02,2018,First Quarter 2018,28,34,54
1111,03,2018,First Quarter 2018,28,37,51
1111,04,2018,Second Quarter 2018,28,30,59
1112,01,2018,First Quarter 2018,1,7,12
1112,02,2018,First Quarter 2018,2,7,10
1112,03,2018,First Quarter 2018,5,6,7
1112,04,2018,Second Quarter 2018,4,1,8

QUARTERLY2:

id,qname,data4,data5

1111,First Quarter 2018,53,7
1111,Second Quarter 2018,58,9
1112,First Quarter 2018,7,7
1112,Second Quarter 2018,7,9

合并idqname。因此,对于MONTHLY1中的每个month,使用QUARTERLY2中的值覆盖data 4,并将data 5添加为新变量。最终的数据集看起来应该是(我添加了*,其中添加或覆盖QUARTERLY2中的数据):

MERGED3:

id,month,year,qname,data1,data2,data3,data4,data5

1111,01,2018,First Quarter 2018,27,33,53*,7*
1111,02,2018,First Quarter 2018,28,34,53*,7*
1111,03,2018,First Quarter 2018,28,37,53*,7*
1111,04,2018,Second Quarter 2018,28,30,58*,9*
1112,01,2018,First Quarter 2018,1,7,7*,7*
1112,02,2018,First Quarter 2018,2,7,7*,7*
1112,03,2018,First Quarter 2018,5,6,7*,7*
1112,04,2018,Second Quarter 2018,4,1,7*,9*

谢谢!

2 个答案:

答案 0 :(得分:2)

Usage Note 48705:与第一次观察后的许多数据集中的公共变量的一对多合并将包含来自许多数据集的值,表示:

  

与不是BY的公共变量的一对多合并   变量,客户有时会期望值的共同点   变量来自" one"数据集将保留在整个BY中   如果" one"变量在MERGE语句中列出第二位。   在一对一合并和第一次匹配中是正确的   在一对多合并中观察,共同变量的值   后一个数据集会覆盖先前数据的值   组。但是,在MERGE语句的后续迭代中   相同的BY组," one"数据集不再读取。因此,   结果输出包含来自"许多"的变量的值。   数据集。

您可以通过重命名非变量来改变行为,因此它不是共同的 - 新的非公共变量值将在后续的许多匹配项中保持并且可以应用。

例如(您的数据)

每月(很多)

data have_monthly;
infile cards dlm=',';
length id month year 8 qname $30; input
id month year qname data1 data2 data3; data4=_n_*1000; datalines;
1111,01,2018,First Quarter 2018,27,33,55
1111,02,2018,First Quarter 2018,28,34,54
1111,03,2018,First Quarter 2018,28,37,51
1111,04,2018,Second Quarter 2018,28,30,59
1112,01,2018,First Quarter 2018,1,7,12
1112,02,2018,First Quarter 2018,2,7,10
1112,03,2018,First Quarter 2018,5,6,7
1112,04,2018,Second Quarter 2018,4,1,8
run;

每季度(一个)

data have_quarterly;
infile cards dlm=',';
length id 8 qname $30;
input id qname data4 data5; datalines;
1111,First Quarter 2018,53,7
1111,Second Quarter 2018,58,9
1112,First Quarter 2018,7,7
1112,Second Quarter 2018,7,9
run;

默认合并

data try (label="The quarter data4 values are not propagated");
  merge
    have_monthly
    have_quarterly
  ;
  by
    id
    qname
  ;
run;

与重命名相同合并,以确保非变量 data4

中的非共性
data want(label="The quarter data4 values are propagated");
  merge
    have_monthly
    have_quarterly (rename=data4=_data4)
  ;
  by
    id
    qname
  ;
  data4 = _data4;
run;

答案 1 :(得分:0)

由于SAS将在merge中覆盖相同的命名列,但仅限于第一次匹配,因此请考虑在合并期间重命名。然后,保留所需的列。下面还演示了左连接合并(保留 Montlhy1 中的所有行,无论它是否与 Quarterly1 匹配):

proc sort data=Monthly1; by id qname; run;
proc sort data=Quarterly2; by id qname; run;

data merged3;
    merge Monthly1(in=x RENAME=(data4=data4_x)) Quarterly2(in=y);
    by id qname;
    if x;
    keep id month year qname data1-data5; 
run;

或者,考虑使用proc sql进行左连接合并,并显式保留由表别名指定的列。同样,使用了left join

proc sql;
    create table merged4 as
    select m.id, m.month, m.year, m.qname, m.data1, m.data2, m.data3, q.data4, q.data5
    from Monthly1 m
    left join Quarterly2 q
      on m.id = q.id AND m.qname = q.qname;
quit;