SAS使用铅功能

问题描述:

的假设数据集有三列SAS使用铅功能

Date Region Price 
01-03 A  1 
01-03 A  2 
01-03 B  3 
01-03 B  4 
01-03 A  5 
01-04 B  4 
01-04 B  6 
01-04 B  7 

我试图通过下面的代码来获取铅价的日期和地区。

data want; 
set have; 
by _ric date_l_; 
do until (eof); 
set have(firstobs=2 keep=price rename=(price=lagprice)) end=eof; 
end; 
if last.date_l_ then call missing(lagprice); 
run; 

但是,想要只有一个意见。然后我创建new_date=date并尝试另一个代码:

data want; 
set have nobs=nobs; 
    do _i = _n_ to nobs until (new_date ne Date); 
    if eof1=0 then 
    set have (firstobs=2 keep=price rename=(price=leadprice)) end=eof1; 
    else leadprice=.; 
    end; 
run; 

使用此代码,SAS正在运行缓慢。所以我认为这段代码也不合适。有谁能提出一些建议吗?谢谢

尝试通过变量排序你想铅价则一起设置了两次:

data test; 
length Date Region $12 Price 8 ; 
input Date $ Region $ Price ; 
datalines; 
    01-03 A  1 
    01-03 A  2 
    01-03 B  3 
    01-03 B  4 
    01-03 A  5 
    01-04 B  4 
    01-04 B  6 
    01-04 B  7 
    ; 
run; 

** sort by vars you want lead price for **; 
proc sort data = test; 
    by DATE REGION; 
run; 

** set together twice -- once for lead price and once for all variables **; 
data lead_price; 
    set test; 
    by DATE REGION; 
    set test (firstobs = 2 keep = PRICE rename = (PRICE = LEAD_PRICE)) 
     test (obs = 1 drop = _ALL_); 
    if last.DATE or last.REGION then do; 
     LEAD_PRICE = .; 
    end; 
run; 

您可以使用proc expand按组生成数值变量的线索。试试下面的方法来代替:

第1步:按地区,日期

proc sort data=have; 
    by Region Date; 
run; 

第2步:创建一个新的ID变量设置为观察数

因为你有多个值每个地区的日期,我们需要生成一个新的ID变量,以便proc expand使用lead而不是date

data have2; 
    set have; 

    _ID_ = _N_; 
run; 

第3步:通过区域与lead改造

lead因为它的声音会做完全运行proc expand。只要数据支持,您可以根据您的喜好创建尽可能多的值。在这种情况下,我们是由一个观察引导的。

proc expand data=have2 
      out=want; 
    by Region; 
    id _ID_; 
    convert Price = Lead_Price/transform=(lead 1) ; 
run;