SAS / SQL:组合两列,同时保留其他列

时间:2016-11-23 17:36:08

标签: sql merge sas

我需要合并两个数据集。每个数据集包含一个连续的观察数。第一个数据集仅包含第一个观察结果。第二个数据集包含所有后续观察。并非所有受试者都有相同数量的观察结果。

问题如下。有两种不同类型的主题。该类型仅包含在第一个数据集中。当我将两个数据集合并在一起时,所有观察结果都缺少类型,但每个主题都是第一个。请参阅下面的示例。

我想知道如何使用SQL和DATA步骤执行此操作。我的实际数据集并不大,因此处理效率不是主要问题。

我尝试过使用RETAIN,但由于第二个数据集不包含TYPE变量,因此没有值可以保留。关于SQL,似乎UNION应该有效,并且互联网上有无数UNION的例子,但它们都涉及一个变量。我需要知道如何在保留Observation并分配ID的同时Amount Type变量data set1; input ID $ Observation Type $ Amount ; datalines; 002 1 A 15 026 1 A 30 031 1 B 7 028 1 B 10 036 1 A 22 ; run; data set2; input ID $ Observation Amount ; datalines; 002 2 11 002 3 35 002 4 13 002 5 12 026 2 21 026 3 12 026 4 40 031 2 11 028 2 27 036 2 10 036 3 15 036 4 16 036 5 12 036 6 20 ; run; proc sort data = set1; by ID Observation ; run; proc sort data = set2; by ID Observation ; run; data merged; merge set1 set2 ; by ID Observation ; run; 。{/ p>

示例

                      ID     Observation    Type    Amount

                      002         1          A        15
                      002         2                   11
                      002         3                   35
                      002         4                   13
                      002         5                   12
                      026         1          A        30
                      026         2                   21
                      026         3                   12
                      026         4                   40
                      028         1          B        10
                      028         2                   27
                      031         1          B         7
                      031         2                   11
                      036         1          A        22
                      036         2                   10
                      036         3                   15
                      036         4                   16
                      036         5                   12
                      036         6                   20

这给出了

                      ID     Observation    Type    Amount

                      002         1          A        15
                      002         2          A        11
                      002         3          A        35
                      002         4          A        13
                      002         5          A        12
                      026         1          A        30
                      026         2          A        21
                      026         3          A        12
                      026         4          A        40
                      028         1          B        10
                      028         2          B        27
                      031         1          B         7
                      031         2          B        11
                      036         1          A        22
                      036         2          A        10
                      036         3          A        15
                      036         4          A        16
                      036         5          A        12
                      036         6          A        20

然而,我需要的是

log2(n)

3 个答案:

答案 0 :(得分:0)

我确定还有其他方法可以做到这一点,但这就是我的做法。

首先,堆叠数据只保留公共字段。

data new;
set set1 (drop = TYPE) set2;
run;

然后重新合并类型字段。

proc sql;
create table new2 as select
a.*,
b.TYPE
from new a
left join set1 b
on a.id=b.id;
quit;

答案 1 :(得分:0)

Proc SQL:

proc sql;
   create table want as
   select coalesce(a.id,b.id) as id,observation,type,amount from (select * from set1(drop=type) union 
   select * from set2) a left join set1 (keep=id type) b
on a.id=b.id;
quit; 

答案 2 :(得分:0)

DATA步骤方法很简单,只需使用SETBY来交错记录。您需要创建一个NEW变量来保留值。如果您愿意,可以删除旧的并重命名新的名称。

data want ;
  set set1 set2 ;
  by id ;
  if first.id then new_type=type;
  retain new_type;
run;

对于SQL,使用@JJFord3发布的方法首先联合公共字段,然后合并TYPE标志。您可以合并为一个语句。

proc sql;
  create table want as 
    select a.*,b.type
    from 
      (select id,observation,amount from set1
       union
       select id,observation,amount from set2
      ) a
    left join set1 b
    on a.id = b.id
    order by 1,2
  ;
quit;