在SAS中填写系列

时间:2017-09-25 17:15:41

标签: 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。

你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分: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    

答案 1 :(得分: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