我正在使用以下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
这已经困扰了我几个星期,如果有人有任何见解,那么我将不胜感激!
答案 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查询中完成整个操作。