我想要一个城市纵向/面板数据集中所有变量的报告。PROC MEANS
在这方面做得很好,但是它不能处理包含列的情况,这些列表示所讨论的变量不缺少的第一个和最后一个日期。
我的数据看起来像这样:
data have;
input date $ city $ var1 var2 var3;
datalines;
2006Q1 NYC . 0.1 4
2006Q2 NYC . 0.48 6
2006Q3 NYC . 0.55 7
2006Q4 NYC 5 0.33 2
2007Q1 NYC 8 . 10
2007Q3 NYC 12 . 15
2006Q1 BOS 11 0.6 .
2006Q2 BOS 6 0.81 .
2006Q3 BOS 1 0.66 9
2006Q4 BOS 2 0.5 1
2007Q1 BOS 4 0.61 8
2007Q3 BOS 19 0.4 1
;
run;
我想要的输出是一个表,看起来像这样:
City Variable First Nonmiss Last Nonmiss
BOS var1 2006Q1 2007Q3
BOS var2 2006Q1 2007Q3
BOS var3 2006Q3 2007Q3
NYC var1 2006Q4 2007Q3
NYC var2 2006Q1 2006Q4
NYC var3 2006Q1 2007Q3
也许PROC TRANSPOSE
和create table
在PROC SQL
是最好的方法,但我愿意接受建议——我真的不确定从哪里开始。
谢谢!
我肯定会在这里使用proc transpose
方法;这很简单。这利用了first.
和last.
是在实现where
子句之后定义的这一事实。proc sort data=have;
by city date;
run;
proc transpose data=have out=have_t;
by city date;
var var1-var3;
run;
proc sort data=have_t;
by city _name_ date;
run;
data want;
set have_t;
by city _name_ date;
retain first_nonmiss;
where not missing(col1);
if first._name_ then do;
first_nonmiss = date;
end;
if last._name_ then do;
last_nonmiss = date;
output;
call missing(of first_nonmiss); *I like to do this for safety even though it is irrelevant here - later code might make it relevant;
end;
run;
使用PROC MEANS/SUMMARY绝对可以得到这个输出,但是您需要转换数据,这样可能会取消我的答案。
data have;
input date $ city $ var1 var2 var3;
datalines;
2006Q1 NYC . 0.1 4
2006Q2 NYC . 0.48 6
2006Q3 NYC . 0.55 7
2006Q4 NYC 5 0.33 2
2007Q1 NYC 8 . 10
2007Q3 NYC 12 . 15
2006Q1 BOS 11 0.6 .
2006Q2 BOS 6 0.81 .
2006Q3 BOS 1 0.66 9
2006Q4 BOS 2 0.5 1
2007Q1 BOS 4 0.61 8
2007Q3 BOS 19 0.4 1
;
run;
proc print;
run;
data want;
input City $ Variable $ First_Nonmiss $ Last_Nonmiss $;
cards;
BOS var1 2006Q1 2007Q3
BOS var2 2006Q1 2007Q3
BOS var3 2006Q3 2007Q3
NYC var1 2006Q4 2007Q3
NYC var2 2006Q1 2006Q4
NYC var3 2006Q1 2007Q3
;;;;
proc print;
run;
proc transpose data=have out=havet name=variable;
by city date notsorted;
var var:;
run;
proc print;
run;
proc summary data=havet nway missing;
class city variable;
where not missing(col1);
output out=want2(drop=_:)
idgroup(out(date)=first_nonmiss)
idgroup(last out(date)=last_nonmiss)
;
run;
proc print;
run;
proc compare base=want compare=want2 listequalvars;
run;