Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays sas宏循环一年中有多少天_Arrays_Loops_If Statement_Macros_Sas - Fatal编程技术网

Arrays sas宏循环一年中有多少天

Arrays sas宏循环一年中有多少天,arrays,loops,if-statement,macros,sas,Arrays,Loops,If Statement,Macros,Sas,我有如下数据 我需要为每个人展示一年中活了多少天 ı在宏中尝试了许多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.

我有如下数据

我需要为每个人展示一年中活了多少天

ı在宏中尝试了许多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

你能帮帮我吗?

这里有一种方法可以帮你。无需宏,只需一个数据步骤执行循环:

data have;
input name $3. (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循环。如果您不知道,那么您可以编写另一段代码来实现这一点。

这里有另一个选项,您可能不需要提前了解开始/结束年份

data have;
input name $3. (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

请分享您迄今为止尝试过的代码。即使它不工作,也可能只需要一些小的调整。另外,您是否绝对需要使用您指定的宽格式?对于大多数事情,我建议使用长格式,即一年一列,每人每年一行,其中包括他们在这一年的生活天数。嗨,用户667489。代码在我的工作电脑里。如果你明天需要的话,我会送你。不,不需要宽格式,欢迎使用长格式。但是我不知道你怎么做。我是这方面的新手。我想我需要这种宽幅格式。因为我的数据有点大,这个解决方案使我的数据长了10倍。但非常感谢您的精彩回答。如果您不进行任何后续排序或其他处理,您可以创建一个视图,只需更改
所需的数据
需要数据/查看=需要。这样,它就不会占用任何额外的磁盘空间
如果生存天数>0,则输出,这将根据示例数据将其缩小很多。是的,你是对的。非常感谢。明天我将处理它。