2017-09-25 53 views
-1

我有一個數據看起來像這樣的數據在SAS中填充系列

/************************** ************************************************** ****/
YYMM部門
1701農業
1611零售
1501 CRE
/*****/ 還有另外一個數據集看起來像這樣/ * ************

Customer_ID YYMM
XXXX 1702
XXXX 1701
XXXX 1612
XXXX 1611
XXXX 1610
XXXX 1510
XXXX 1509
/******************* *************************************/

所以基本上我只想要這兩個在YYMM的基礎上進行數據集處理,但在各部門合併。但是由於之前的數據只有幾個YYMM,我想要做的就是複製這些扇區,直到從第一個數據集中遇到新的yymm。 因此,從1701到1612的部門應該是農業部門,從1611到1502的部門是零售部門,而在1501之前的任何一個月都必須是CRE。

你能告訴我該怎麼做嗎?

+0

格式,數組,SQL連接 - 這一切都將正常工作。您可能需要預先處理第一個表格,以便它包含從 - 到值(例如1502 - 1611零售)。 如果轉換在SAS中完成(不會傳遞給另一個RDBMS),我認爲使用格式是最快的。另一方面加入是簡單的解決方案。讓我知道你是否需要幫助預處理第一個表格(可以輕鬆完成數據步驟)。 – Petr

+0

請發佈您迄今已嘗試過的內容。 – Reeza

回答

0

這是一個proc格式的解決方案。由於您的數據採用yymm格式,因此您可以在不進行數據轉換的情況下設置限制邏輯,但我對實際日期感到更加舒適。

data Begin; 
    input Customer_ID $ YYMM $; 
    cards; 
    XXXX 1702 
    YYYY 1701 
    ZZZZ 1612 
    OOOO 1611 
    AAAA 1610 
    FFFF 1510 
    DDDD 1509 
; run; 

data with_date; 
    set begin; 
    date = mdy(substr(yymm,3,2), 1, substr(yymm,1,2)); 
run; 

proc format; /*Didn't check the bins too much. Adjust as needed.*/ 
    value sector 
    low - '1jan2015'd ='lows' 
    '1jan2015'd < - '1nov2016'd = 'CRE' 
    '1nov2016'd < - '1jan2017'd = 'Retail' 
    '1jan2017'd < - high = 'Agriculture' 
; 
run; 

data wanted; 
    set with_date; 
    format date sector.; 
run; 

更多關於PROC格式看到http://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a002473474.htm

1

這裏是一個基於SQL溶液(類似於由pinegulf提出的一個)。

讓我們創建測試數據集:

data T01; 
length Sector $20; 
infile cards; 
input YYMM_to Sector; 
cards; 
1701 Agriculture 
1611 Retail 
1501 CRE 
; 
run; 

data T02; 
length Customer_id $10; 
infile cards; 
input Customer_ID YYMM; 
cards; 
AXXX 1702 
BXXX 1701 
CXXX 1612 
DXXX 1611 
EXXX 1610 
FXXX 1510 
GXXX 1509 
; 
run; 

我們可以添加一個 「YYMM_from」 列T01:

proc sort data=T01; 
by YYMM_to; 
run; 

data T01; 
set T01; 
by YYMM_to; 
YYMM_from=lag(YYMM_to); 
if _N_=1 then YYMM_from=0; 
run; 

proc print data=T01; 
run; 

我們得到:

Obs  Sector  YYMM_to  YYMM_from 
------------------------------------------ 
1  CRE   1501  0 
2  Retail  1611  1501 
3  Agriculture 1701  1611 

然後是加入:

proc sql; 
create table T03 as 
select a.*, b.Sector 
from T02 a LEFT JOIN T01 b 
on YYMM_from<a.YYMM<=YYMM_to; 
quit; 

proc print data=T03; 
quit; 

我們得到:

Obs Customer_id YYMM Sector 
----------------------------------------- 
1  DXXX   1611 Retail 
2  EXXX   1610 Retail 
3  FXXX   1510 Retail 
4  GXXX   1509 Retail 
5  BXXX   1701 Agriculture 
6  CXXX   1612 Agriculture 
7  AXXX   1702