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