我目前正在尝试编写一些遍历我的数据的代码,并根据“周”列中的日期将数字标记为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
答案 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
。.
)?这种墙纸代码通常可以用算术表达式更好地表示。
例如,假设整数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;