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;
我不确定标题是否公正地回答了这个问题,但它是这样的:
我有三个数据集 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;