2017-06-08 70 views
1

的假設數據集有三列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正在運行緩慢。所以我認爲這段代碼也不合適。有誰能提出一些建議嗎?謝謝

回答

2

嘗試通過變量排序你想鉛價則一起設置了兩次:

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; 
0

您可以使用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;