增量日期变量

时间:2015-09-16 13:11:00

标签: date sas increment

我有一个SAS数据集,我必须在其中添加一个日期变量,从某个日期开始(例如:2014年7月10日)。对于每次观察,日期必须增加一天。我无法弄清楚如何增加日期。每当我尝试时,我都会得到所有观察的相同日期。

1 个答案:

答案 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 StatementSAS 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!