SAS - 使用proc sql设置平衡面板数据

时间:2017-08-09 03:28:21

标签: sql sas

我正在使用以下PROC SQL步骤来提取数据:

PROC SQL;  

create table panel as  
select ID, Month, Var1, Var2, Var3  
from data  
order by ID, Month;  
quit;  

我想使用数据来构建平衡的面板数据集,但会丢失ID,这意味着每个月的每个变量的值应该等于零。

我无法弄清楚如何编写查询或任何数据步骤,将缺少的ID插入到每个月的数据集中,然后将值作为值。

例如,我的查询将生成下表:
UNBALANCED PANEL

我的问题是有一个ID“A”没有在我提取的数据中表示,但ID“A”确实存在。此外,为了增加复杂性,ID“C”会间歇性地出现在PROC SQL中,而不是按月出现,但我想将其显示为每月未出现在数据库中的零。因此,我试图为每个月显示已知ID的任何缺失数据,并为每个Var显示零。

例如:
BALANCED PANEL

这已经困扰了我几个星期,如果有人有任何见解,那么我将不胜感激!

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但它使用易于理解的基本代码:

1)数据集将包含所有已知ID和月

data ids;
infile datalines;
input ID $;
month='Jan'; output;
month='Feb'; output;
month='Mar'; output;
month='Apr'; output;
month='May'; output;
month='Jun'; output;
month='Jul'; output;
month='Aug'; output;
month='Sep'; output;
month='Oct'; output;
month='Nov'; output;
month='Dec'; output;
datalines;
A
B
C
D
;
run;

(这个例子是静态的,因为我不知道你的数据,但如果你可以从某个地方取出它们,例如select distinct ID, Month from table,那当然要好得多了)

2)像你一样做你的proc sql:

proc sql;
create table panel as  
select ID, Month, Var1, Var2, Var3  
from data  
order by ID, Month;  
quit;

3)然后右键将您的结果与“零表格相关联,以获取'缺失ID'的记录

proc sql;
create table panel_balanced as
select coalesce(t1.ID,t2.ID) as ID
      ,coalesce(t1.Month,t2.Month) as Month
      ,coalesce(t1.var1,0) as var1
      ,coalesce(t1.var2,0) as var2
      ,coalesce(t1.var3,0) as var3
from panel t1
right join ids t2
  on t1.ID=t2.ID
  and t1.Month=t2.Month
;
quit;

如果步骤1中的表也可以使用SQL创建,您当然可以将第2步和第3步合并为一个查询,甚至可以在一个SQL查询中完成整个操作。