SAS:合并两个具有相同列的表,同时删除空值

SAS: Merging two tables with identical columns while dropping null values

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

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

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

预测 1 如下所示:

预测 2 如下所示:

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

理想情况下成品应该是这样的:

我尝试过各种类型的合并和集合,但我总是收到重复的日期行。我将如何为所有 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

我倾向于使用 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

您尝试过 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      .     .     .

考虑使用聚合的联合查询。唯一的缺点是在外部查询中写出所有 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;

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

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