【问题标题】:SAS: Merging two tables with identical columns while dropping null valuesSAS:合并两个具有相同列的表,同时删除空值
【发布时间】:2017-04-02 14:33:00
【问题描述】:

我不确定标题是否正确回答了这个问题,但它是这样的:

我有三个数据集 Forecasts1、Forecasts2 和 Forecasts3。它们都是由日期变量和变量 r1 到 r241 组成的时间序列数据。

对于给定的 r 变量(让我们只使用 r1-r3,现在只使用预测 1 和 2)每个数据集只有一个值不为空的行,并且它是每个数据集中的不同行。

预测 1 如下所示:

预测 2 如下所示:

我需要能够组合它们以使 r1-r3 包含所有非空值,而无需创建重复的日期行来保存空值。

所以理想的成品应该是这样的:

我尝试了各种类型的合并和集合,但我不断收到重复的日期行。我将如何为所有 241 个(或更多)变量正确执行此操作? (特别是在 SAS 或 Proc SQL 中?)

包含数据的 GOOGLE 文档链接:

预测1:https://docs.google.com/spreadsheets/d/1iUEwPltU6V6ijgnkALFiIdrwrolDFt8xaITZaFC4WN8/edit?usp=sharing

预测2: https://docs.google.com/spreadsheets/d/1lQGKYJlz6AAR-DWtoWnl8SwzCNAmSpj7yxRqRgnybr8/edit?usp=sharing

【问题讨论】:

  • 您可以发布示例数据吗?照片不算数,因为我无法将它们粘贴到编辑器中。
  • 我添加了两个包含电子表格的 Google Drive 链接。这样就够了吗?
  • 查看我的回复,了解如何发布数据的示例。
  • 啊,明白了。我会记下的。

标签: database merge sas proc-sql


【解决方案1】:

您尝试过 UPDATE 语句吗?

data forecast1 ;
  input date r1-r3 ;
cards;
1 1 . .
2 . 2 .
3 . . 3
4 . . . 
;
data forecast2 ;
  input date r1-r3 ;
cards;
2 2 . .
3 . 3 .
4 . . 4 
5 . . .
;

data want ;
  update forecast1 forecast2 ;
  by date ;
run;

proc print; run;

结果

date    r1    r2    r3
  1      1     .     .
  2      2     2     .
  3      .     3     3
  4      .     .     4
  5      .     .     .

【讨论】:

    【解决方案2】:

    我倾向于使用proc sql 来解决这些类型的问题。假设数据集中每个date 一行,您可以使用full outer join

    proc sql;
        select coalesce(f1.date, f2.date) as date,
               coalesce(f1.r1, f2.r1) as r1,
               coalesce(f1.r2, f2.r2) as r2,
               coalesce(f1.r3, f2.r3) as r3
        from forecast1 f1 full outer join
             forecast2 f2
             on f1.date = f2.date
    

    【讨论】:

    • 当你有超过 241 个变量时,这个规模如何?
    • @JoshKraushaar 。 . .我会在电子表格中生成代码。但是,SAS 提供了其他替代方法来遍历数据步骤中的列。但是,这指出了将这些数据全部放在一行中的愚蠢行为。我希望每个数据项有一行,而不是多列。
    【解决方案3】:

    考虑使用聚合的联合查询。唯一的缺点是写出外部查询中所有 241 列的聚合。

    proc sql;
       SELECT sub.date, Max(sub.r1) AS R1, Max(sub.r2) AS R2, Max(sub.r3) AS R3, ...
       FROM
         (SELECT *
          FROM Forecasts1 f1
          UNION ALL
          SELECT *
          FROM Forecasts2 f2) As sub
        GROUP BY sub.date
    quit;
    

    【讨论】:

      【解决方案4】:

      另一种解决方案是追加所有行并删除所有缺失的行。

      data want; 
        set forecast1-forecast3 indsname=fc;
        model = fc; *store name of forecast model;
        if nmiss(of r1-r3) = 3 then delete;
      run;
      

      【讨论】:

      • 哦,这非常有效,我认为这可能是理想的解决方案。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 2022-08-11
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多