SAS 通过 class 为每个变量确定第一个和最后一个非缺失 ID/日期
SAS determine first and last non-missing ID / date by class for each variable
我想要按城市列出 longitudinal/panel 数据集中所有变量的报告。 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;
我想要的输出是 table,看起来像这样:
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
和 PROC SQL
中的 create table
是执行此操作的最佳方法,但我愿意接受建议 - 我不确定在哪里开始。
谢谢!
我肯定会在这里采用 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;
我想要按城市列出 longitudinal/panel 数据集中所有变量的报告。 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;
我想要的输出是 table,看起来像这样:
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
和 PROC SQL
中的 create table
是执行此操作的最佳方法,但我愿意接受建议 - 我不确定在哪里开始。
谢谢!
我肯定会在这里采用 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;