SAS - 从一列创建另一列的公式

SAS - formula for creation of one column from another

我的问题如下 - 我正在从另一列 (disc_pc_nonann) 创建一列 (diskont_faktor),创建公式因行号而异。

第 1 行的函数是 diskont_faktor = 1/disc_pc_nonann;

第 2 行到第 n 行的函数是 diskont_faktor = diskont_faktor(t-1)/disc_pc_nonann;

我尝试了以下代码:

 data soubor2; 
         set srv.data;
   disc_pc_nonann = (1+DISC_PC/100)**(1/12);

   if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
   else diskont_faktor = lag1(diskont_faktor)/disc_pc_nonann;
 run;

但 SAS 不会计算行 > 1 的值。 是否有某些特定原因导致功能滞后在此代码设置中不起作用?

我什至尝试过这个版本都没有成功:

 data soubor2; 
         set srv.data;
   disc_pc_nonann = (1+DISC_PC/100)**(1/12);

   if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
   else do; y=lag1(diskont_faktor); 
            diskont_faktor = y/disc_pc_nonann;
        end;
 run;

感谢您对我做错的任何建议。

您需要在程序开始时初始化变量 diskont_faktor,因此在开始处添加一个 retain diskont_faktor;。 lag1 return 的第一个电话是你 a 。 ,因为当时队列是空的,所以对于 _n_ = 2 它只会 return 将你的值从 _n_= 1 存储在队列中。 _n_ = 3 应该可以工作,但将 _n_=2 的空结果存储在队列中。因为对于 n=2 你没有结果,_n_= 4 将再次 return 没有结果。这一直持续下去,所以你有奇数 _n_ 的结果而没有偶数 _n_.

的结果

所以我不知道如何解决这个问题, 但我可以为您提供一个没有延迟的替代解决方案:

 data soubor2 (drop=diskont_faktor_old); 
   retain diskont_faktor_old;
   set srv.data;
   disc_pc_nonann = (1+DISC_PC/100)**(1/12);
   if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
   else diskont_faktor = diskont_faktor_old/disc_pc_nonann;
   diskont_faktor_old=diskont_faktor; 
 run;

LAG() 函数不会 return 之前观察到的值。相反,它 return 是它在调用时生成的堆栈中的先前值。因此,仅对某些观察结果执行 lag() ,您没有正确堆叠这些值。

解决此问题的一个简单方法是将 LAG() 函数调用的值放入一个变量中。这样它会针对每次观察运行,因此它总是 return 是以前的值。然后,您可以根据需要有条件地引用该变量,而不会中断 LAG() 函数的值流。

lag_diskont_faktor=lag(diskont_faktor);
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = lag_diskont_faktor/disc_pc_nonann;

但是对于您的问题,您似乎并不真的需要使用 LAG()。您可以只使用 RETAIN 来防止 SAS 在开始 DATA 步的下一次迭代时将新变量设置为缺失。

retain diskont_faktor; 
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = diskont_faktor/disc_pc_nonann;

您甚至可以在 RETAIN 语句中设置变量的初始值并简化代码。

retain diskont_faktor 1; 
diskont_faktor = diskont_faktor/disc_pc_nonann;