If-Else-Then与today()

时间:2019-06-21 18:16:37

标签: date if-statement sas

我目前正在尝试编写一些遍历我的数据的代码,并根据“周”列中的日期将数字标记为0-12。该数字将出现在名为group的新列中,该列由您在下面看到的代码创建。问题在于此列是一直向下的句点,而不是数字。日志中没有错误消息,所以我不知道我哪里出错了(对sas来说是很新的)。 PS。日期范围从6/17到9/9

data have;
set have;
if today()+84 = Week > today()+79 then group=12;
else if today()+77 = Week > today()+72 then group=11;
else if today()+70 = Week > today()+65 then group=10;
else if today()+63 = Week > today()+58 then group=9;
else if today()+56 = Week > today()+51 then group=8;
else if today()+49 = Week > today()+45 then group=7;
else if today()+42 = Week > today()+37 then group=6;
else if today()+35 = Week > today()+30 then group=5;
else if today()+28 = Week > today()+23 then group=4;
else if today()+21 = Week > today()+16 then group=3;
else if today()+14 = Week > today()+11 then group=2;
else if today()+7  = Week > today()+2 then group=1;
else if today()    = Week > today()-5 then group=0;
run;

更新: 第一列称为“星期”,是未来12周的星期一。其余的列都是变量,我最终将根据行所在的组对其求和。

例如:

  week       ID var2 ... var18
    17jun2019 1    x        x   
    24jun2019 1    x        x

,并且一直持续到2019年9月9日。它会为每个ID(大约10,000个ID)执行此操作,但并非每个ID都会持续12周,这就是为什么我使用else if

我希望它看起来像

   week      ID var2 ... var18 group
    17jun2019 1    x        x    0
    24jun2019 1    x        x    1
    01july2019 1   x        x    2





3 个答案:

答案 0 :(得分:1)

可以通过搜索SAS Operators in Expression在SAS帮助中找到对SAS操作员的完整参考。 SAS表达式可以使用某些在整个编码语言中相对唯一的运算符。这是在新编码的SAS中通常找不到的一些(在撰写本文时)

  • <> MAX运算符
  • >< MIN运算符
  • 暗示AND运算符
  

对于两个由AND链接的公共变量进行的比较,可以使用隐含的AND进行压缩。

因此,初学者可能会误解

… 
if today()+35 = Week > today()+30 then group=5;
… 

不正确,而不是将其识别为隐含AND

… 
if today()+35 = Week   AND   Week > today()+30 then group=5;
… 

在语法上正确时, = 中的implied AND导致表达式仅在相等时才为真。 open interval(today()+ 35,today()+ 34)中的星期值在上述表达式中永远不会评估为true。这是您看到的缺少值(.)的可能原因。

  • 为什么代码在序列30,23,16,11,2,-5中显示7的非静态增量?
  • 应该是30,23,16,9,2,-5
  • 换句话说,为什么第1组在其他所有其他人都为3时(例如[+ 14,+ 11))会在5天范围内拍摄[+7,+2)?
  • 为什么会有2天的域(假定为周末)没有分配组,因此会丢失(.)?

这种墙纸代码通常可以用算术表达式更好地表示。

例如,假设整数SAS日期值:

group = ifn ( MOD (week-today(), 7) in (1,2)
            , .
            , CEIL (week-today() / 7 )
            );

if not ( 0 <= group <= 12 ) then group = .; * probably dont want this but makes it compliant with OP;

明天将组值“ 可能错误”,因为它是基于today()的。考虑对视图进行编码,而不是创建永久数据集-或-将元信息放入变量名group_on_20190622 = …

如果您坚持使用墙纸,请考虑使用select语句,该语句不太容易出现因分号错误或其他字符丢失而导致的键入错误。

答案 1 :(得分:1)

目前还不清楚您要做什么。听起来有点像您想根据日期变量(称为WEEK)距离今天的日期有几周来对观察结果进行分组。仅使用INTCK()函数可能是最简单的。这将计算两个日期之间跨越了几周的界限。

data have ;
  input id week date9.;
  format week date9.;
cards;
1 17jun2019
1 24jun2019
1 01jul2019
2 24jun2019
2 01jul2019
2 08jul2019
;

data want ;
 set have;
 group = intck('week',today(),week);
run;

然后您可以总结每组ID的数量。

proc freq data=want;
  tables group;
run;

结果:

The FREQ Procedure

                                  Cumulative    Cumulative
group    Frequency     Percent     Frequency      Percent
----------------------------------------------------------
   -1           1       16.67             1        16.67
    0           2       33.33             3        50.00
    1           2       33.33             5        83.33
    2           1       16.67             6       100.00

答案 2 :(得分:0)

假设星期是日期而不是日期时间。

data test;
do i = 1 to 30;
 dt = intnx('day',today(),1*i);
 output;
end;
format dt date9.;
run;


data test2;
set test;
if dt ge today() and dt le today()+7 then dt2 = 1;
else if dt ge today()+8 and dt le today()+14 then dt2 = 2;
else if dt ge today()+15 and dt le today()+21 then dt2 = 3;
else if dt ge today()+22 and dt le today()+28 then dt2 = 4;
else if dt ge today()+29 and dt le today()+35 then dt2 = 5;
/* another way */
dt3 = ceil(intck('day',today(),dt)/7); 
run;
  • 删除了错误的答案。