sas宏循环一年有多少天
sas macro do loop how many day in a year
我有如下数据。
我需要显示每个人在特定的一年里活了多少天。
我在宏中尝试了很多 do 循环和 if 语句。
我工作了很多,但我做不到,我的手空空如也,我的心碎了。
*name STARTDATE ENDDATE
*AAA 17.10.2012 21.11.2013
*BBB 10.05.2014 15.09.2015
*CCC 06.04.2010 05.05.2013
*DDD 07.02.2011 07.02.2013
*EEE 30.03.2013 30.01.2014
*FFF 01.01.2010 06.05.2010
因此我需要这个
*name STARTDATE ENDDATE DayIn2010 DayIn2011 DayIn2012 DayIn2013 DayIn2014 DayIn2015
*AAA 17.10.2012 21.11.2013 0 0 75 325 0 0
*BBB 10.05.2014 15.09.2015 0 0 0 0 235 258
*CCC 06.04.2010 05.05.2013 269 365 365 125 0 0
*DDD 07.02.2011 07.02.2013 0 327 365 38 0 0
*EEE 30.03.2013 30.01.2014 0 0 0 276 30 0
*FFF 01.01.2010 06.05.2010 125 0 0 0 0 0
你能帮帮我吗?
这是您可以执行此操作的一种方法。不需要宏,只需一个数据步骤 do-loop:
data have;
input name . (STARTDATE ENDDATE) (+1 ddmmyy10.);
format STARTDATE ENDDATE ddmmyy10.;
cards;
AAA 17.10.2012 21.11.2013
BBB 10.05.2014 15.09.2015
CCC 06.04.2010 05.05.2013
DDD 07.02.2011 07.02.2013
EEE 30.03.2013 30.01.2014
FFF 01.01.2010 06.05.2010
;
run;
data want;
set have;
format YEAR_START YEAR_END ddmmyy10.;
do YEAR = 2010 to 2015;
YEAR_START = mdy(1,1,YEAR);
YEAR_END = mdy(12,31,YEAR);
DAYS_ALIVE = max(0,min(ENDDATE, YEAR_END) - max(STARTDATE,YEAR_START) + 1);
output;
end;
run;
您需要提前知道数据集中的最小和最大年份值,以便您可以编写正确的 do 循环。如果你不这样做,那么你可以编写另一段代码来做到这一点。
这是另一个选项,您可能不需要提前 start/end 年了解。
data have;
input name . (STARTDATE ENDDATE) (+1 ddmmyy10.);
format STARTDATE ENDDATE ddmmyy10.;
cards;
AAA 17.10.2012 21.11.2013
BBB 10.05.2014 15.09.2015
CCC 06.04.2010 05.05.2013
DDD 07.02.2011 07.02.2013
EEE 30.03.2013 30.01.2014
FFF 01.01.2010 06.05.2010
;
run;
data s1;
set have;
do dt=startdate to enddate;
output;
end;
run;
ods output CrossTabFreqs=s2 (where=(not missing(dt) and not missing(name)) keep=name dt frequency );
proc freq data=s1;
tables name*dt /
NOROW
NOCOL
NOPERCENT
NOCUM;
format dt year4.;
run;
proc sort data=s2;
by name;
run;
PROC TRANSPOSE DATA=s2
OUT=want(drop=_name_ _label_)
PREFIX=DaysIn
;
BY name;
ID dt;
VAR Frequency;
RUN; QUIT
我有如下数据。
我需要显示每个人在特定的一年里活了多少天。
我在宏中尝试了很多 do 循环和 if 语句。
我工作了很多,但我做不到,我的手空空如也,我的心碎了。
*name STARTDATE ENDDATE
*AAA 17.10.2012 21.11.2013
*BBB 10.05.2014 15.09.2015
*CCC 06.04.2010 05.05.2013
*DDD 07.02.2011 07.02.2013
*EEE 30.03.2013 30.01.2014
*FFF 01.01.2010 06.05.2010
因此我需要这个
*name STARTDATE ENDDATE DayIn2010 DayIn2011 DayIn2012 DayIn2013 DayIn2014 DayIn2015
*AAA 17.10.2012 21.11.2013 0 0 75 325 0 0
*BBB 10.05.2014 15.09.2015 0 0 0 0 235 258
*CCC 06.04.2010 05.05.2013 269 365 365 125 0 0
*DDD 07.02.2011 07.02.2013 0 327 365 38 0 0
*EEE 30.03.2013 30.01.2014 0 0 0 276 30 0
*FFF 01.01.2010 06.05.2010 125 0 0 0 0 0
你能帮帮我吗?
这是您可以执行此操作的一种方法。不需要宏,只需一个数据步骤 do-loop:
data have;
input name . (STARTDATE ENDDATE) (+1 ddmmyy10.);
format STARTDATE ENDDATE ddmmyy10.;
cards;
AAA 17.10.2012 21.11.2013
BBB 10.05.2014 15.09.2015
CCC 06.04.2010 05.05.2013
DDD 07.02.2011 07.02.2013
EEE 30.03.2013 30.01.2014
FFF 01.01.2010 06.05.2010
;
run;
data want;
set have;
format YEAR_START YEAR_END ddmmyy10.;
do YEAR = 2010 to 2015;
YEAR_START = mdy(1,1,YEAR);
YEAR_END = mdy(12,31,YEAR);
DAYS_ALIVE = max(0,min(ENDDATE, YEAR_END) - max(STARTDATE,YEAR_START) + 1);
output;
end;
run;
您需要提前知道数据集中的最小和最大年份值,以便您可以编写正确的 do 循环。如果你不这样做,那么你可以编写另一段代码来做到这一点。
这是另一个选项,您可能不需要提前 start/end 年了解。
data have;
input name . (STARTDATE ENDDATE) (+1 ddmmyy10.);
format STARTDATE ENDDATE ddmmyy10.;
cards;
AAA 17.10.2012 21.11.2013
BBB 10.05.2014 15.09.2015
CCC 06.04.2010 05.05.2013
DDD 07.02.2011 07.02.2013
EEE 30.03.2013 30.01.2014
FFF 01.01.2010 06.05.2010
;
run;
data s1;
set have;
do dt=startdate to enddate;
output;
end;
run;
ods output CrossTabFreqs=s2 (where=(not missing(dt) and not missing(name)) keep=name dt frequency );
proc freq data=s1;
tables name*dt /
NOROW
NOCOL
NOPERCENT
NOCUM;
format dt year4.;
run;
proc sort data=s2;
by name;
run;
PROC TRANSPOSE DATA=s2
OUT=want(drop=_name_ _label_)
PREFIX=DaysIn
;
BY name;
ID dt;
VAR Frequency;
RUN; QUIT