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

时间:2017-04-02 14:33:00

标签: database merge sas proc-sql

我不确定这个标题是否正确,但这里是:

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

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

预测1看起来像这样:

Forecast1

预测2看起来像这样:

Forecast2

我需要能够将它们组合在一起,使得r1-r3包含所有非空值,而不会创建重复的日期行来保存空值。

理想情况下,成品将如下所示:

Ideal final product

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

与包含数据的Google DOC链接:

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

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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