2017-08-09 139 views
0

我使用下面的SQL PROC步提取数据: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 “ 确实存在。另外,为了增加复杂性,间歇性地在PROC SQL中出现ID“C”而不是每月,但是我想将它显示为每个月它不出现在数据库中的零。因此,我试图让每个月出现已知ID的任何缺失数据,并且每个Var都有零。

例如:
BALANCED PANEL

这已被绊倒我要几个星期,如果任何人有任何见解那么将不胜感激!

+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; 

当然你也可以联合执行步骤2和3成一个查询,甚至做如果第1步中的表也可以使用SQL创建,则在一个SQL查询中执行整个事件。