在SAS中填充系列

在SAS中填充系列,sas,Sas,我有一个数据,这个数据看起来像这样 /********************************************************************************/ YYMM扇区 1701农业 1611零售 1501 CRE /*************/ 还有另一个数据集看起来像这样/************* 客户ID YYMM XXXX 1702 XXXX 1701 XXXX 1612 XXXX 1611 XXXX 1610 XXXX 1510 XXXX

我有一个数据,这个数据看起来像这样

/********************************************************************************/
YYMM扇区
1701农业
1611零售
1501 CRE
/*************/ 还有另一个数据集看起来像这样/*************

客户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


你能告诉我怎么做吗?

这里有一个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;
数据开始;
输入客户ID$YYMM$;
卡;
XXXX 1702
YYYY 1701
ZZZ1612
OOOO 1611
AAAA 1610
FFFF 1510
DDDD 1509
; 跑
数据与_日期;
设置开始;
日期=mdy(子序列(yymm,3,2),1,子序列(yymm,1,2));
跑
proc格式/*没有检查太多垃圾箱。根据需要进行调整*/
价值部门
低-2015年1月1日低
'2015年1月1日<-'2016年11月1日='CRE'
“2016年11月1日”<-“2017年1月1日”=“零售”
‘2017年1月1日<-高=‘农业’
;
跑
需要数据;
设置日期;
格式化日期扇区。;
跑

有关proc格式的更多信息,请参见

,这里是一个基于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;
我们可以在T01中添加“YYMM_from”列:

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
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    
然后是加入:

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;

格式、数组、SQL连接—所有这些都将起作用。您可能希望预处理第一个表,使其包含从-到值(例如1502-1611零售)。如果转换是在SAS中完成的(而不是传递给另一个RDBMS),我认为使用格式是最快的。另一方面,Join是一个简单的解决方案。如果您需要关于第一个表的预处理的帮助(可以在数据步骤中轻松完成),请告诉我。请发布您迄今为止尝试过的内容。