我有一个SAS数据集,我必须在其中添加一个日期变量,从某个日期开始(例如:2014年7月10日)。对于每次观察,日期必须增加一天。我无法弄清楚如何增加日期。每当我尝试时,我都会得到所有观察的相同日期。
答案 0 :(得分:2)
欢迎使用Stack Overflow!让我们假设您的数据集看起来如此:
<强>有无强>
Obs Var1
1 Mazda
2 Ford
3 BMW
<强>需要强>
Obs Date Var1
1 01JAN2015 Mazda
2 02JAN2015 Ford
3 03JAN2015 BMW
您可以使用Sum Statement和SAS Date Literal来完成此目标。
data want;
format Date date9. /* Makes date the first var, looks prettier */
set have;
if(_N_ = 1) then Date = '31DEC2014'd; /* Set initial value */
Date+1; /* Increment SAS date value by 1 day for each day */
run;
如果之前没有使用自动变量 N ,那么每次SAS从数据步骤的顶部到底部时,它都是一个迭代计数器。
您每天看到相同日期的可能原因是您没有保留要增加的值。请考虑以下示例程序:
data WontWork;
set have;
Add_Me = 1;
/* Do loop just simulates dataset iterations */
do i = 1 to 10;
Add_Me = Add_Me + 1;
output;
end;
drop i;
run;
<强>解释强>
每当SAS运行数据步骤的一次迭代时,程序数据向量(PDV)会将所有非自动变量重置为丢失。要解决此问题,您必须使用Retain语句然后递增变量,或者使用Sum语句来完成保留和汇总变量的工作。保留/求和语句都告诉SAS记住变量的最后一个值,以便在迭代数据步骤时不会重置为丢失。 retain语句的一个独特属性是您可以设置初始值。默认情况下,retain语句会将变量初始化为缺失。 sum语句将始终将变量初始化为缺失。
data works;
retain Add_Me 0;
/* Do loop just simulates dataset iterations */
do i = 1 to 10;
Add_Me = sum(Add_Me, 1);
output;
end;
drop i;
run;
OR
data works2;
/* Do loop just simulates dataset iterations */
do i = 1 to 10;
Add_Me+1;
output;
end;
drop i;
run;
请注意,sum语句执行这两个步骤,并且还处理缺失值。把它想象成一条捷径。
我希望这可以解决您的问题,并再次欢迎Stack Overflow!