【问题标题】:SAS/SQL: Combine two columns while retaining othersSAS/SQL:合并两列,同时保留其他列
【发布时间】:2017-04-07 20:15:51
【问题描述】:

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

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

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

我曾尝试使用RETAIN,但由于第二个数据集不包含TYPE 变量,因此没有可保留的值。关于 SQL,UNION 似乎应该可以工作,并且互联网上有无数的UNION 示例,但它们都涉及单个变量。我需要知道如何通过ID 联合Observation 变量,同时保留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;

这给了

                      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

【问题讨论】:

    标签: sql merge sas


    【解决方案1】:

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

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

    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;
    

    【讨论】:

      【解决方案2】:

      过程 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; 
      

      【讨论】:

      • 感谢您的编辑。我不清楚为什么需要合并,因为选择 a.idb.id 会产生相同的结果。这是我第一次遇到 coalesce,所以我可能遗漏了一些东西。
      • 通常使用 FULL JOIN 您需要使用 COALESCE() 因为您不知道哪个贡献表将缺少 ID 值。但在这种情况下,别名 B 中的所有内容也都在别名 A 中,因此您可以使用 A.ID。
      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 2013-04-05
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多