【问题标题】:SAS - formula for creation of one column from anotherSAS - 从另一列创建一列的公式
【发布时间】:2016-06-17 08:56:36
【问题描述】:

我的问题如下 - 我正在从另一列 (disk_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;

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

【问题讨论】:

    标签: function sas calculated-columns


    【解决方案1】:

    LAG() 函数不返回先前观察的值。相反,它从调用它时生成的堆栈中返回前一个值。因此,仅对某些观察结果执行 lag(),您并没有正确堆叠这些值。

    解决此问题的一种简单方法是将LAG() 函数调用的值放入一个变量中。这样它会为每个观察运行,所以它总是返回以前的值。然后,您可以根据需要有条件地引用该变量,而不会中断 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;
    

    【讨论】:

      【解决方案2】:

      您需要在程序开始时初始化变量discont_faktor,因此在开始时添加retain diskont_faktor;。 lag1 的第一次调用会返回一个 . ,因为当时队列是空的,所以对于_n_ = 2,它只会将来自_n_= 1 的值存储在队列中。 _n_ = 3 应该可以工作,但将来自 _n_=2 的空结果存储在队列中。因为对于 n=2 你没有结果,_n_= 4 将不再返回任何内容。这样一直持续下去,所以奇数 _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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2018-09-23
        相关资源
        最近更新 更多